diff --git a/build/VStudio/winfsp_dll.vcxproj b/build/VStudio/winfsp_dll.vcxproj index 68b428f0..15938c0b 100644 --- a/build/VStudio/winfsp_dll.vcxproj +++ b/build/VStudio/winfsp_dll.vcxproj @@ -173,6 +173,7 @@ + diff --git a/build/VStudio/winfsp_dll.vcxproj.filters b/build/VStudio/winfsp_dll.vcxproj.filters index 8c278830..76348406 100644 --- a/build/VStudio/winfsp_dll.vcxproj.filters +++ b/build/VStudio/winfsp_dll.vcxproj.filters @@ -26,6 +26,9 @@ Source + + Source + diff --git a/src/dll/fsctl.c b/src/dll/fsctl.c index 3cf50f1a..fadc2608 100644 --- a/src/dll/fsctl.c +++ b/src/dll/fsctl.c @@ -11,13 +11,6 @@ #define GLOBALROOT L"\\\\?\\GLOBALROOT" -static inline PVOID Malloc(SIZE_T Size) -{ - PVOID P = malloc(Size); - if (0 != P) - SetLastError(ERROR_NO_SYSTEM_RESOURCES); - return P; -} static inline VOID GlobalDevicePath(PWCHAR DevicePathBuf, SIZE_T DevicePathSize, PWSTR DevicePath) { StringCbPrintfW(DevicePathBuf, DevicePathSize, @@ -49,10 +42,10 @@ static NTSTATUS CreateSelfRelativeSecurityDescriptor(PSECURITY_DESCRIPTOR Securi OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token) && (GetTokenInformation(Token, TokenUser, 0, 0, &UserSize) || ERROR_INSUFFICIENT_BUFFER == GetLastError()) && - (User = Malloc(UserSize)) && + (User = MemAllocSLE(UserSize)) && GetTokenInformation(Token, TokenUser, User, UserSize, &UserSize) && (AclSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(User->User.Sid) - sizeof(DWORD)) && - (Acl = Malloc(AclSize)) && + (Acl = MemAllocSLE(AclSize)) && InitializeAcl(Acl, AclSize, ACL_REVISION) && AddAccessAllowedAce(Acl, ACL_REVISION, FILE_ALL_ACCESS, User->User.Sid) && InitializeSecurityDescriptor(&SecurityDescriptorStruct, SECURITY_DESCRIPTOR_REVISION) && @@ -77,7 +70,7 @@ static NTSTATUS CreateSelfRelativeSecurityDescriptor(PSECURITY_DESCRIPTOR Securi { SelfRelativeSecurityDescriptorSize = GetSecurityDescriptorLength(SecurityDescriptor); Success = - (SelfRelativeSecurityDescriptor = Malloc(SelfRelativeSecurityDescriptorSize)) && + (SelfRelativeSecurityDescriptor = MemAllocSLE(SelfRelativeSecurityDescriptorSize)) && memcpy(SelfRelativeSecurityDescriptor, SecurityDescriptor, SelfRelativeSecurityDescriptorSize); } else @@ -86,7 +79,7 @@ static NTSTATUS CreateSelfRelativeSecurityDescriptor(PSECURITY_DESCRIPTOR Securi Success = (MakeSelfRelativeSD(SecurityDescriptor, 0, &SelfRelativeSecurityDescriptorSize) || ERROR_INSUFFICIENT_BUFFER == GetLastError()) && - (SelfRelativeSecurityDescriptor = Malloc(SelfRelativeSecurityDescriptorSize)) && + (SelfRelativeSecurityDescriptor = MemAllocSLE(SelfRelativeSecurityDescriptorSize)) && (MakeSelfRelativeSD(SecurityDescriptor, SelfRelativeSecurityDescriptor, &SelfRelativeSecurityDescriptorSize)); } if (!Success) @@ -103,11 +96,11 @@ exit: if (0 != Token) CloseHandle(Token); - free(Acl); - free(User); + MemFree(Acl); + MemFree(User); if (STATUS_SUCCESS != Result) - free(SelfRelativeSecurityDescriptor); + MemFree(SelfRelativeSecurityDescriptor); return Result; } @@ -132,10 +125,10 @@ FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, if (!NT_SUCCESS(Result)) goto exit; - ParamsBuf = Malloc(FSP_FSCTL_VOLUME_PARAMS_SIZE + SelfRelativeSecurityDescriptorSize); + ParamsBuf = MemAlloc(FSP_FSCTL_VOLUME_PARAMS_SIZE + SelfRelativeSecurityDescriptorSize); if (0 == ParamsBuf) { - Result = FspNtStatusFromWin32(GetLastError()); + Result = STATUS_INSUFFICIENT_RESOURCES; goto exit; } memset(ParamsBuf, 0, FSP_FSCTL_VOLUME_PARAMS_SIZE); @@ -184,8 +177,8 @@ exit: if (INVALID_HANDLE_VALUE != DeviceHandle) CloseHandle(DeviceHandle); - free(ParamsBuf); - free(SelfRelativeSecurityDescriptor); + MemFree(ParamsBuf); + MemFree(SelfRelativeSecurityDescriptor); return Result; } diff --git a/src/dll/library.c b/src/dll/library.c new file mode 100644 index 00000000..721e3cbc --- /dev/null +++ b/src/dll/library.c @@ -0,0 +1,23 @@ +/** + * @file dll/library.c + * + * @copyright 2015 Bill Zissimopoulos + */ + +#include + +HANDLE ProcessHeap; + +BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, PVOID Reserved) +{ + switch (Reason) + { + case DLL_PROCESS_ATTACH: + ProcessHeap = GetProcessHeap(); + if (0 == ProcessHeap) + return FALSE; + break; + } + + return TRUE; +} diff --git a/src/dll/library.h b/src/dll/library.h index ef8b2bb9..e19e9283 100644 --- a/src/dll/library.h +++ b/src/dll/library.h @@ -21,4 +21,24 @@ #define DEBUGLOG(fmt, ...) ((void)0) #endif +static inline PVOID MemAlloc(SIZE_T Size) +{ + extern HANDLE ProcessHeap; + return HeapAlloc(ProcessHeap, 0, Size); +} +static inline PVOID MemAllocSLE(SIZE_T Size) +{ + extern HANDLE ProcessHeap; + PVOID Pointer = HeapAlloc(ProcessHeap, 0, Size); + if (0 == Pointer) + SetLastError(ERROR_NO_SYSTEM_RESOURCES); + return Pointer; +} +static inline VOID MemFree(PVOID Pointer) +{ + extern HANDLE ProcessHeap; + if (0 != Pointer) + HeapFree(ProcessHeap, 0, Pointer); +} + #endif diff --git a/src/dll/loop.c b/src/dll/loop.c index fe2a6fdc..060badd2 100644 --- a/src/dll/loop.c +++ b/src/dll/loop.c @@ -26,7 +26,7 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, if (0 == ProcessRequest) ProcessRequest = FspProcessRequestDirect; - FileSystem = malloc(sizeof *FileSystem); + FileSystem = MemAlloc(sizeof *FileSystem); if (0 == FileSystem) { Result = STATUS_INSUFFICIENT_RESOURCES; @@ -53,7 +53,7 @@ exit: { if (INVALID_HANDLE_VALUE != VolumeHandle) CloseHandle(VolumeHandle); - free(FileSystem); + MemFree(FileSystem); } return Result; @@ -63,7 +63,7 @@ FSP_API VOID FspFileSystemDelete(FSP_FILE_SYSTEM *FileSystem) { if (INVALID_HANDLE_VALUE != FileSystem->VolumeHandle) CloseHandle(FileSystem->VolumeHandle); - free(FileSystem); + MemFree(FileSystem); } FSP_API NTSTATUS FspFileSystemLoop(FSP_FILE_SYSTEM *FileSystem) @@ -73,7 +73,7 @@ FSP_API NTSTATUS FspFileSystemLoop(FSP_FILE_SYSTEM *FileSystem) SIZE_T RequestBufSize; FSP_FSCTL_TRANSACT_REQ *Request, *NextRequest; - RequestBuf = malloc(FSP_FSCTL_TRANSACT_REQ_BUFFER_SIZEMIN); + RequestBuf = MemAlloc(FSP_FSCTL_TRANSACT_REQ_BUFFER_SIZEMIN); if (0 == RequestBuf) return STATUS_INSUFFICIENT_RESOURCES; @@ -101,7 +101,7 @@ FSP_API NTSTATUS FspFileSystemLoop(FSP_FILE_SYSTEM *FileSystem) } exit: - free(RequestBuf); + MemFree(RequestBuf); return Result; } @@ -122,7 +122,7 @@ static DWORD WINAPI FspProcessRequestInPoolWorker(PVOID Param) FSP_FSCTL_TRANSACT_REQ *Request = (PVOID)WorkItem->RequestBuf; WorkItem->FileSystem->Operations[Request->Kind](WorkItem->FileSystem, Request); - free(WorkItem); + MemFree(WorkItem); return 0; } @@ -136,7 +136,7 @@ FSP_API NTSTATUS FspProcessRequestInPool(FSP_FILE_SYSTEM *FileSystem, FSP_WORK_ITEM *WorkItem; BOOLEAN Success; - WorkItem = malloc(sizeof *WorkItem + Request->Size); + WorkItem = MemAlloc(sizeof *WorkItem + Request->Size); if (0 == WorkItem) return STATUS_INSUFFICIENT_RESOURCES; @@ -146,7 +146,7 @@ FSP_API NTSTATUS FspProcessRequestInPool(FSP_FILE_SYSTEM *FileSystem, Success = QueueUserWorkItem(FspProcessRequestInPoolWorker, WorkItem, WT_EXECUTEDEFAULT); if (!Success) { - free(WorkItem); + MemFree(WorkItem); return FspNtStatusFromWin32(GetLastError()); }