mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-29 19:18:39 -05:00 
			
		
		
		
	sys: ContextByName
This commit is contained in:
		
							
								
								
									
										158
									
								
								src/sys/device.c
									
									
									
									
									
								
							
							
						
						
									
										158
									
								
								src/sys/device.c
									
									
									
									
									
								
							| @@ -35,6 +35,15 @@ VOID FspFsvolDeviceDeleteContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier, | |||||||
| static RTL_AVL_COMPARE_ROUTINE FspFsvolDeviceCompareContext; | static RTL_AVL_COMPARE_ROUTINE FspFsvolDeviceCompareContext; | ||||||
| static RTL_AVL_ALLOCATE_ROUTINE FspFsvolDeviceAllocateContext; | static RTL_AVL_ALLOCATE_ROUTINE FspFsvolDeviceAllocateContext; | ||||||
| static RTL_AVL_FREE_ROUTINE FspFsvolDeviceFreeContext; | static RTL_AVL_FREE_ROUTINE FspFsvolDeviceFreeContext; | ||||||
|  | PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName); | ||||||
|  | PVOID FspFsvolDeviceLookupChildContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName); | ||||||
|  | PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context, | ||||||
|  |     FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted); | ||||||
|  | VOID FspFsvolDeviceDeleteContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, | ||||||
|  |     PBOOLEAN PDeleted); | ||||||
|  | static RTL_AVL_COMPARE_ROUTINE FspFsvolDeviceCompareContextByName; | ||||||
|  | static RTL_AVL_ALLOCATE_ROUTINE FspFsvolDeviceAllocateContextByName; | ||||||
|  | static RTL_AVL_FREE_ROUTINE FspFsvolDeviceFreeContextByName; | ||||||
| VOID FspFsvolGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); | VOID FspFsvolGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); | ||||||
| BOOLEAN FspFsvolTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); | BOOLEAN FspFsvolTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); | ||||||
| VOID FspFsvolSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_INFO *VolumeInfo); | VOID FspFsvolSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_INFO *VolumeInfo); | ||||||
| @@ -59,6 +68,13 @@ VOID FspDeviceDeleteAll(VOID); | |||||||
| #pragma alloc_text(PAGE, FspFsvolDeviceCompareContext) | #pragma alloc_text(PAGE, FspFsvolDeviceCompareContext) | ||||||
| #pragma alloc_text(PAGE, FspFsvolDeviceAllocateContext) | #pragma alloc_text(PAGE, FspFsvolDeviceAllocateContext) | ||||||
| #pragma alloc_text(PAGE, FspFsvolDeviceFreeContext) | #pragma alloc_text(PAGE, FspFsvolDeviceFreeContext) | ||||||
|  | #pragma alloc_text(PAGE, FspFsvolDeviceLookupContextByName) | ||||||
|  | #pragma alloc_text(PAGE, FspFsvolDeviceLookupChildContextByName) | ||||||
|  | #pragma alloc_text(PAGE, FspFsvolDeviceInsertContextByName) | ||||||
|  | #pragma alloc_text(PAGE, FspFsvolDeviceDeleteContextByName) | ||||||
|  | #pragma alloc_text(PAGE, FspFsvolDeviceCompareContextByName) | ||||||
|  | #pragma alloc_text(PAGE, FspFsvolDeviceAllocateContextByName) | ||||||
|  | #pragma alloc_text(PAGE, FspFsvolDeviceFreeContextByName) | ||||||
| #pragma alloc_text(PAGE, FspDeviceCopyList) | #pragma alloc_text(PAGE, FspDeviceCopyList) | ||||||
| #pragma alloc_text(PAGE, FspDeviceDeleteList) | #pragma alloc_text(PAGE, FspDeviceDeleteList) | ||||||
| #pragma alloc_text(PAGE, FspDeviceDeleteAll) | #pragma alloc_text(PAGE, FspDeviceDeleteAll) | ||||||
| @@ -293,10 +309,19 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject) | |||||||
|         return Result; |         return Result; | ||||||
|     FsvolDeviceExtension->InitDoneIoq = 1; |     FsvolDeviceExtension->InitDoneIoq = 1; | ||||||
|  |  | ||||||
|     /* initialize our generic table */ |     /* initialize our context table */ | ||||||
|  |     ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource); | ||||||
|     ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource); |     ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource); | ||||||
|     RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextTable, |     RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextTable, | ||||||
|         FspFsvolDeviceCompareContext, FspFsvolDeviceAllocateContext, FspFsvolDeviceFreeContext, 0); |         FspFsvolDeviceCompareContext, | ||||||
|  |         FspFsvolDeviceAllocateContext, | ||||||
|  |         FspFsvolDeviceFreeContext, | ||||||
|  |         0); | ||||||
|  |     RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable, | ||||||
|  |         FspFsvolDeviceCompareContextByName, | ||||||
|  |         FspFsvolDeviceAllocateContextByName, | ||||||
|  |         FspFsvolDeviceFreeContextByName, | ||||||
|  |         0); | ||||||
|     FsvolDeviceExtension->InitDoneCtxTab = 1; |     FsvolDeviceExtension->InitDoneCtxTab = 1; | ||||||
|  |  | ||||||
|     /* initialize our timer routine and start our expiration timer */ |     /* initialize our timer routine and start our expiration timer */ | ||||||
| @@ -339,17 +364,13 @@ static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject) | |||||||
|  |  | ||||||
|     if (FsvolDeviceExtension->InitDoneCtxTab) |     if (FsvolDeviceExtension->InitDoneCtxTab) | ||||||
|     { |     { | ||||||
| #if 0 |  | ||||||
|         /* FspDeviceFreeElement is now a no-op, so this is no longer necessary */ |  | ||||||
|         /* |         /* | ||||||
|          * Enumerate and delete all entries in the ContextTable. |          * FspDeviceFreeContext/FspDeviceFreeContextByName is a no-op, so it is not necessary | ||||||
|          * There is no need to protect accesses to the table as we are in the device destructor. |          * to enumerate and delete all entries in the ContextTable. | ||||||
|          */ |          */ | ||||||
|         FSP_DEVICE_GENERIC_TABLE_ELEMENT_DATA *Element; |  | ||||||
|         while (0 != (Element = RtlGetElementGenericTableAvl(&FsvolDeviceExtension->ContextTable, 0))) |  | ||||||
|             RtlDeleteElementGenericTableAvl(&FsvolDeviceExtension->ContextTable, &Element->Identifier); |  | ||||||
| #endif |  | ||||||
|         ExDeleteResourceLite(&FsvolDeviceExtension->ContextTableResource); |         ExDeleteResourceLite(&FsvolDeviceExtension->ContextTableResource); | ||||||
|  |         ExDeleteResourceLite(&FsvolDeviceExtension->FileRenameResource); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* finalize our delete lock */ |     /* finalize our delete lock */ | ||||||
| @@ -516,6 +537,123 @@ static VOID NTAPI FspFsvolDeviceFreeContext( | |||||||
|     PAGED_CODE(); |     PAGED_CODE(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName) | ||||||
|  | { | ||||||
|  |     PAGED_CODE(); | ||||||
|  |  | ||||||
|  |     FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); | ||||||
|  |     FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA *Result; | ||||||
|  |  | ||||||
|  |     Result = RtlLookupElementGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable, &FileName); | ||||||
|  |  | ||||||
|  |     return 0 != Result ? Result->Context : 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | PVOID FspFsvolDeviceLookupChildContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName) | ||||||
|  | { | ||||||
|  |     PAGED_CODE(); | ||||||
|  |  | ||||||
|  |     FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); | ||||||
|  |     BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch; | ||||||
|  |     FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA *Result; | ||||||
|  |     PVOID RestartKey; | ||||||
|  |  | ||||||
|  |     Result = RtlLookupFirstMatchingElementGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable, | ||||||
|  |         &FileName, &RestartKey); | ||||||
|  |     if (0 == Result) | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     Result = RtlEnumerateGenericTableWithoutSplayingAvl(&FsvolDeviceExtension->ContextByNameTable, | ||||||
|  |         &RestartKey); | ||||||
|  |     if (0 == Result) | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     if (RtlPrefixUnicodeString(FileName, Result->FileName, CaseInsensitive) && | ||||||
|  |         FileName->Length < Result->FileName->Length && | ||||||
|  |         '\\' == Result->FileName->Buffer[FileName->Length / sizeof(WCHAR)]) | ||||||
|  |         return Result->Context; | ||||||
|  |     else | ||||||
|  |         return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context, | ||||||
|  |     FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted) | ||||||
|  | { | ||||||
|  |     PAGED_CODE(); | ||||||
|  |  | ||||||
|  |     FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); | ||||||
|  |     FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA *Result, Element = { 0 }; | ||||||
|  |  | ||||||
|  |     ASSERT(0 != ElementStorage); | ||||||
|  |     Element.FileName = FileName; | ||||||
|  |     Element.Context = Context; | ||||||
|  |  | ||||||
|  |     FsvolDeviceExtension->ContextByNameTableElementStorage = ElementStorage; | ||||||
|  |     Result = RtlInsertElementGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable, | ||||||
|  |         &Element, sizeof Element, PInserted); | ||||||
|  |     FsvolDeviceExtension->ContextByNameTableElementStorage = 0; | ||||||
|  |  | ||||||
|  |     ASSERT(0 != Result); | ||||||
|  |  | ||||||
|  |     return Result->Context; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | VOID FspFsvolDeviceDeleteContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, | ||||||
|  |     PBOOLEAN PDeleted) | ||||||
|  | { | ||||||
|  |     PAGED_CODE(); | ||||||
|  |  | ||||||
|  |     FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); | ||||||
|  |     BOOLEAN Deleted; | ||||||
|  |  | ||||||
|  |     Deleted = RtlDeleteElementGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable, &FileName); | ||||||
|  |  | ||||||
|  |     if (0 != PDeleted) | ||||||
|  |         *PDeleted = Deleted; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static RTL_GENERIC_COMPARE_RESULTS NTAPI FspFsvolDeviceCompareContextByName( | ||||||
|  |     PRTL_AVL_TABLE Table, PVOID FirstElement, PVOID SecondElement) | ||||||
|  | { | ||||||
|  |     PAGED_CODE(); | ||||||
|  |  | ||||||
|  |     FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = | ||||||
|  |         CONTAINING_RECORD(Table, FSP_FSVOL_DEVICE_EXTENSION, ContextByNameTable); | ||||||
|  |     BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch; | ||||||
|  |     PUNICODE_STRING FirstFileName = *(PUNICODE_STRING *)FirstElement; | ||||||
|  |     PUNICODE_STRING SecondFileName = *(PUNICODE_STRING *)SecondElement; | ||||||
|  |     LONG ComparisonResult; | ||||||
|  |  | ||||||
|  |     ComparisonResult = RtlCompareUnicodeString(FirstFileName, SecondFileName, CaseInsensitive); | ||||||
|  |  | ||||||
|  |     if (0 > ComparisonResult) | ||||||
|  |         return GenericLessThan; | ||||||
|  |     else | ||||||
|  |     if (0 < ComparisonResult) | ||||||
|  |         return GenericGreaterThan; | ||||||
|  |     else | ||||||
|  |         return GenericEqual; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static PVOID NTAPI FspFsvolDeviceAllocateContextByName( | ||||||
|  |     PRTL_AVL_TABLE Table, CLONG ByteSize) | ||||||
|  | { | ||||||
|  |     PAGED_CODE(); | ||||||
|  |  | ||||||
|  |     FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = | ||||||
|  |         CONTAINING_RECORD(Table, FSP_FSVOL_DEVICE_EXTENSION, ContextByNameTable); | ||||||
|  |  | ||||||
|  |     ASSERT(sizeof(FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT) == ByteSize); | ||||||
|  |  | ||||||
|  |     return FsvolDeviceExtension->ContextByNameTableElementStorage; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static VOID NTAPI FspFsvolDeviceFreeContextByName( | ||||||
|  |     PRTL_AVL_TABLE Table, PVOID Buffer) | ||||||
|  | { | ||||||
|  |     PAGED_CODE(); | ||||||
|  | } | ||||||
|  |  | ||||||
| VOID FspFsvolGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo) | VOID FspFsvolGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo) | ||||||
| { | { | ||||||
|     // !PAGED_CODE(); |     // !PAGED_CODE(); | ||||||
|   | |||||||
| @@ -449,6 +449,16 @@ typedef struct | |||||||
|     RTL_BALANCED_LINKS Header; |     RTL_BALANCED_LINKS Header; | ||||||
|     FSP_DEVICE_CONTEXT_TABLE_ELEMENT_DATA Data; |     FSP_DEVICE_CONTEXT_TABLE_ELEMENT_DATA Data; | ||||||
| } FSP_DEVICE_CONTEXT_TABLE_ELEMENT; | } FSP_DEVICE_CONTEXT_TABLE_ELEMENT; | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     PUNICODE_STRING FileName; | ||||||
|  |     PVOID Context; | ||||||
|  | } FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA; | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     RTL_BALANCED_LINKS Header; | ||||||
|  |     FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA Data; | ||||||
|  | } FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT; | ||||||
| enum | enum | ||||||
| { | { | ||||||
|     FspFsctlDeviceExtensionKind = '\0ltC',  /* file system control device (e.g. \Device\WinFsp.Disk) */ |     FspFsctlDeviceExtensionKind = '\0ltC',  /* file system control device (e.g. \Device\WinFsp.Disk) */ | ||||||
| @@ -478,9 +488,12 @@ typedef struct | |||||||
|     KSPIN_LOCK ExpirationLock; |     KSPIN_LOCK ExpirationLock; | ||||||
|     WORK_QUEUE_ITEM ExpirationWorkItem; |     WORK_QUEUE_ITEM ExpirationWorkItem; | ||||||
|     BOOLEAN ExpirationInProgress; |     BOOLEAN ExpirationInProgress; | ||||||
|  |     ERESOURCE FileRenameResource; | ||||||
|     ERESOURCE ContextTableResource; |     ERESOURCE ContextTableResource; | ||||||
|     RTL_AVL_TABLE ContextTable; |     RTL_AVL_TABLE ContextTable; | ||||||
|     PVOID ContextTableElementStorage; |     PVOID ContextTableElementStorage; | ||||||
|  |     RTL_AVL_TABLE ContextByNameTable; | ||||||
|  |     PVOID ContextByNameTableElementStorage; | ||||||
|     UNICODE_STRING VolumeName; |     UNICODE_STRING VolumeName; | ||||||
|     WCHAR VolumeNameBuf[FSP_DEVICE_VOLUME_NAME_LENMAX / sizeof(WCHAR)]; |     WCHAR VolumeNameBuf[FSP_DEVICE_VOLUME_NAME_LENMAX / sizeof(WCHAR)]; | ||||||
|     KSPIN_LOCK InfoSpinLock; |     KSPIN_LOCK InfoSpinLock; | ||||||
| @@ -516,6 +529,12 @@ PVOID FspFsvolDeviceInsertContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier | |||||||
|     FSP_DEVICE_CONTEXT_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted); |     FSP_DEVICE_CONTEXT_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted); | ||||||
| VOID FspFsvolDeviceDeleteContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier, | VOID FspFsvolDeviceDeleteContext(PDEVICE_OBJECT DeviceObject, UINT64 Identifier, | ||||||
|     PBOOLEAN PDeleted); |     PBOOLEAN PDeleted); | ||||||
|  | PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName); | ||||||
|  | PVOID FspFsvolDeviceLookupChildContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName); | ||||||
|  | PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context, | ||||||
|  |     FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted); | ||||||
|  | VOID FspFsvolDeviceDeleteContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, | ||||||
|  |     PBOOLEAN PDeleted); | ||||||
| VOID FspFsvolGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); | VOID FspFsvolGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); | ||||||
| BOOLEAN FspFsvolTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); | BOOLEAN FspFsvolTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_INFO *VolumeInfo); | ||||||
| VOID FspFsvolSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_INFO *VolumeInfo); | VOID FspFsvolSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_INFO *VolumeInfo); | ||||||
| @@ -570,9 +589,13 @@ typedef struct | |||||||
|     /* interlocked access */ |     /* interlocked access */ | ||||||
|     LONG RefCount; |     LONG RefCount; | ||||||
|     UINT32 DeletePending; |     UINT32 DeletePending; | ||||||
|     /* locked access (ContextTable lock) */ |     /* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableResource */ | ||||||
|     LONG OpenCount; |     LONG OpenCount; | ||||||
|     SHARE_ACCESS ShareAccess; |     SHARE_ACCESS ShareAccess; | ||||||
|  |     FSP_DEVICE_CONTEXT_TABLE_ELEMENT ContextElementStorage; | ||||||
|  |     FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage; | ||||||
|  |     /* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource */ | ||||||
|  |     UNICODE_STRING FileName; | ||||||
|     /* locked under Header.Resource */ |     /* locked under Header.Resource */ | ||||||
|     UINT64 InfoExpirationTime; |     UINT64 InfoExpirationTime; | ||||||
|     UINT32 FileAttributes; |     UINT32 FileAttributes; | ||||||
| @@ -588,8 +611,6 @@ typedef struct | |||||||
|     UINT64 UserContext; |     UINT64 UserContext; | ||||||
|     UINT64 IndexNumber; |     UINT64 IndexNumber; | ||||||
|     BOOLEAN IsDirectory; |     BOOLEAN IsDirectory; | ||||||
|     FSP_DEVICE_CONTEXT_TABLE_ELEMENT ElementStorage; |  | ||||||
|     UNICODE_STRING FileName; |  | ||||||
|     WCHAR FileNameBuf[]; |     WCHAR FileNameBuf[]; | ||||||
| } FSP_FILE_NODE; | } FSP_FILE_NODE; | ||||||
| typedef struct | typedef struct | ||||||
|   | |||||||
| @@ -249,7 +249,7 @@ FSP_FILE_NODE *FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, | |||||||
|     FspFsvolDeviceLockContextTable(FsvolDeviceObject); |     FspFsvolDeviceLockContextTable(FsvolDeviceObject); | ||||||
|  |  | ||||||
|     OpenedFileNode = FspFsvolDeviceInsertContext(FsvolDeviceObject, |     OpenedFileNode = FspFsvolDeviceInsertContext(FsvolDeviceObject, | ||||||
|         FileNode->UserContext, FileNode, &FileNode->ElementStorage, &Inserted); |         FileNode->UserContext, FileNode, &FileNode->ContextElementStorage, &Inserted); | ||||||
|     ASSERT(0 != OpenedFileNode); |     ASSERT(0 != OpenedFileNode); | ||||||
|  |  | ||||||
|     if (Inserted) |     if (Inserted) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user