mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-25 01:42:24 -05:00
dll: MemAlloc/MemFree
This commit is contained in:
parent
f3b87304e8
commit
2b1edc8d29
@ -173,6 +173,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\src\dll\debug.c" />
|
<ClCompile Include="..\..\src\dll\debug.c" />
|
||||||
<ClCompile Include="..\..\src\dll\fsctl.c" />
|
<ClCompile Include="..\..\src\dll\fsctl.c" />
|
||||||
|
<ClCompile Include="..\..\src\dll\library.c" />
|
||||||
<ClCompile Include="..\..\src\dll\loop.c" />
|
<ClCompile Include="..\..\src\dll\loop.c" />
|
||||||
<ClCompile Include="..\..\src\dll\ntstatus.c" />
|
<ClCompile Include="..\..\src\dll\ntstatus.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
<ClCompile Include="..\..\src\dll\loop.c">
|
<ClCompile Include="..\..\src\dll\loop.c">
|
||||||
<Filter>Source</Filter>
|
<Filter>Source</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\dll\library.c">
|
||||||
|
<Filter>Source</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\inc\winfsp\fsctl.h">
|
<ClInclude Include="..\..\inc\winfsp\fsctl.h">
|
||||||
|
@ -11,13 +11,6 @@
|
|||||||
|
|
||||||
#define GLOBALROOT L"\\\\?\\GLOBALROOT"
|
#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)
|
static inline VOID GlobalDevicePath(PWCHAR DevicePathBuf, SIZE_T DevicePathSize, PWSTR DevicePath)
|
||||||
{
|
{
|
||||||
StringCbPrintfW(DevicePathBuf, DevicePathSize,
|
StringCbPrintfW(DevicePathBuf, DevicePathSize,
|
||||||
@ -49,10 +42,10 @@ static NTSTATUS CreateSelfRelativeSecurityDescriptor(PSECURITY_DESCRIPTOR Securi
|
|||||||
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token) &&
|
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token) &&
|
||||||
(GetTokenInformation(Token, TokenUser, 0, 0, &UserSize) ||
|
(GetTokenInformation(Token, TokenUser, 0, 0, &UserSize) ||
|
||||||
ERROR_INSUFFICIENT_BUFFER == GetLastError()) &&
|
ERROR_INSUFFICIENT_BUFFER == GetLastError()) &&
|
||||||
(User = Malloc(UserSize)) &&
|
(User = MemAllocSLE(UserSize)) &&
|
||||||
GetTokenInformation(Token, TokenUser, User, UserSize, &UserSize) &&
|
GetTokenInformation(Token, TokenUser, User, UserSize, &UserSize) &&
|
||||||
(AclSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(User->User.Sid) - sizeof(DWORD)) &&
|
(AclSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(User->User.Sid) - sizeof(DWORD)) &&
|
||||||
(Acl = Malloc(AclSize)) &&
|
(Acl = MemAllocSLE(AclSize)) &&
|
||||||
InitializeAcl(Acl, AclSize, ACL_REVISION) &&
|
InitializeAcl(Acl, AclSize, ACL_REVISION) &&
|
||||||
AddAccessAllowedAce(Acl, ACL_REVISION, FILE_ALL_ACCESS, User->User.Sid) &&
|
AddAccessAllowedAce(Acl, ACL_REVISION, FILE_ALL_ACCESS, User->User.Sid) &&
|
||||||
InitializeSecurityDescriptor(&SecurityDescriptorStruct, SECURITY_DESCRIPTOR_REVISION) &&
|
InitializeSecurityDescriptor(&SecurityDescriptorStruct, SECURITY_DESCRIPTOR_REVISION) &&
|
||||||
@ -77,7 +70,7 @@ static NTSTATUS CreateSelfRelativeSecurityDescriptor(PSECURITY_DESCRIPTOR Securi
|
|||||||
{
|
{
|
||||||
SelfRelativeSecurityDescriptorSize = GetSecurityDescriptorLength(SecurityDescriptor);
|
SelfRelativeSecurityDescriptorSize = GetSecurityDescriptorLength(SecurityDescriptor);
|
||||||
Success =
|
Success =
|
||||||
(SelfRelativeSecurityDescriptor = Malloc(SelfRelativeSecurityDescriptorSize)) &&
|
(SelfRelativeSecurityDescriptor = MemAllocSLE(SelfRelativeSecurityDescriptorSize)) &&
|
||||||
memcpy(SelfRelativeSecurityDescriptor, SecurityDescriptor, SelfRelativeSecurityDescriptorSize);
|
memcpy(SelfRelativeSecurityDescriptor, SecurityDescriptor, SelfRelativeSecurityDescriptorSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -86,7 +79,7 @@ static NTSTATUS CreateSelfRelativeSecurityDescriptor(PSECURITY_DESCRIPTOR Securi
|
|||||||
Success =
|
Success =
|
||||||
(MakeSelfRelativeSD(SecurityDescriptor, 0, &SelfRelativeSecurityDescriptorSize) ||
|
(MakeSelfRelativeSD(SecurityDescriptor, 0, &SelfRelativeSecurityDescriptorSize) ||
|
||||||
ERROR_INSUFFICIENT_BUFFER == GetLastError()) &&
|
ERROR_INSUFFICIENT_BUFFER == GetLastError()) &&
|
||||||
(SelfRelativeSecurityDescriptor = Malloc(SelfRelativeSecurityDescriptorSize)) &&
|
(SelfRelativeSecurityDescriptor = MemAllocSLE(SelfRelativeSecurityDescriptorSize)) &&
|
||||||
(MakeSelfRelativeSD(SecurityDescriptor, SelfRelativeSecurityDescriptor, &SelfRelativeSecurityDescriptorSize));
|
(MakeSelfRelativeSD(SecurityDescriptor, SelfRelativeSecurityDescriptor, &SelfRelativeSecurityDescriptorSize));
|
||||||
}
|
}
|
||||||
if (!Success)
|
if (!Success)
|
||||||
@ -103,11 +96,11 @@ exit:
|
|||||||
if (0 != Token)
|
if (0 != Token)
|
||||||
CloseHandle(Token);
|
CloseHandle(Token);
|
||||||
|
|
||||||
free(Acl);
|
MemFree(Acl);
|
||||||
free(User);
|
MemFree(User);
|
||||||
|
|
||||||
if (STATUS_SUCCESS != Result)
|
if (STATUS_SUCCESS != Result)
|
||||||
free(SelfRelativeSecurityDescriptor);
|
MemFree(SelfRelativeSecurityDescriptor);
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
@ -132,10 +125,10 @@ FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath,
|
|||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
ParamsBuf = Malloc(FSP_FSCTL_VOLUME_PARAMS_SIZE + SelfRelativeSecurityDescriptorSize);
|
ParamsBuf = MemAlloc(FSP_FSCTL_VOLUME_PARAMS_SIZE + SelfRelativeSecurityDescriptorSize);
|
||||||
if (0 == ParamsBuf)
|
if (0 == ParamsBuf)
|
||||||
{
|
{
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
memset(ParamsBuf, 0, FSP_FSCTL_VOLUME_PARAMS_SIZE);
|
memset(ParamsBuf, 0, FSP_FSCTL_VOLUME_PARAMS_SIZE);
|
||||||
@ -184,8 +177,8 @@ exit:
|
|||||||
if (INVALID_HANDLE_VALUE != DeviceHandle)
|
if (INVALID_HANDLE_VALUE != DeviceHandle)
|
||||||
CloseHandle(DeviceHandle);
|
CloseHandle(DeviceHandle);
|
||||||
|
|
||||||
free(ParamsBuf);
|
MemFree(ParamsBuf);
|
||||||
free(SelfRelativeSecurityDescriptor);
|
MemFree(SelfRelativeSecurityDescriptor);
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
23
src/dll/library.c
Normal file
23
src/dll/library.c
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* @file dll/library.c
|
||||||
|
*
|
||||||
|
* @copyright 2015 Bill Zissimopoulos
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <dll/library.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
@ -21,4 +21,24 @@
|
|||||||
#define DEBUGLOG(fmt, ...) ((void)0)
|
#define DEBUGLOG(fmt, ...) ((void)0)
|
||||||
#endif
|
#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
|
#endif
|
||||||
|
@ -26,7 +26,7 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
|
|||||||
if (0 == ProcessRequest)
|
if (0 == ProcessRequest)
|
||||||
ProcessRequest = FspProcessRequestDirect;
|
ProcessRequest = FspProcessRequestDirect;
|
||||||
|
|
||||||
FileSystem = malloc(sizeof *FileSystem);
|
FileSystem = MemAlloc(sizeof *FileSystem);
|
||||||
if (0 == FileSystem)
|
if (0 == FileSystem)
|
||||||
{
|
{
|
||||||
Result = STATUS_INSUFFICIENT_RESOURCES;
|
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
@ -53,7 +53,7 @@ exit:
|
|||||||
{
|
{
|
||||||
if (INVALID_HANDLE_VALUE != VolumeHandle)
|
if (INVALID_HANDLE_VALUE != VolumeHandle)
|
||||||
CloseHandle(VolumeHandle);
|
CloseHandle(VolumeHandle);
|
||||||
free(FileSystem);
|
MemFree(FileSystem);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
@ -63,7 +63,7 @@ FSP_API VOID FspFileSystemDelete(FSP_FILE_SYSTEM *FileSystem)
|
|||||||
{
|
{
|
||||||
if (INVALID_HANDLE_VALUE != FileSystem->VolumeHandle)
|
if (INVALID_HANDLE_VALUE != FileSystem->VolumeHandle)
|
||||||
CloseHandle(FileSystem->VolumeHandle);
|
CloseHandle(FileSystem->VolumeHandle);
|
||||||
free(FileSystem);
|
MemFree(FileSystem);
|
||||||
}
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFileSystemLoop(FSP_FILE_SYSTEM *FileSystem)
|
FSP_API NTSTATUS FspFileSystemLoop(FSP_FILE_SYSTEM *FileSystem)
|
||||||
@ -73,7 +73,7 @@ FSP_API NTSTATUS FspFileSystemLoop(FSP_FILE_SYSTEM *FileSystem)
|
|||||||
SIZE_T RequestBufSize;
|
SIZE_T RequestBufSize;
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request, *NextRequest;
|
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)
|
if (0 == RequestBuf)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ FSP_API NTSTATUS FspFileSystemLoop(FSP_FILE_SYSTEM *FileSystem)
|
|||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
free(RequestBuf);
|
MemFree(RequestBuf);
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
@ -122,7 +122,7 @@ static DWORD WINAPI FspProcessRequestInPoolWorker(PVOID Param)
|
|||||||
FSP_FSCTL_TRANSACT_REQ *Request = (PVOID)WorkItem->RequestBuf;
|
FSP_FSCTL_TRANSACT_REQ *Request = (PVOID)WorkItem->RequestBuf;
|
||||||
|
|
||||||
WorkItem->FileSystem->Operations[Request->Kind](WorkItem->FileSystem, Request);
|
WorkItem->FileSystem->Operations[Request->Kind](WorkItem->FileSystem, Request);
|
||||||
free(WorkItem);
|
MemFree(WorkItem);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -136,7 +136,7 @@ FSP_API NTSTATUS FspProcessRequestInPool(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
FSP_WORK_ITEM *WorkItem;
|
FSP_WORK_ITEM *WorkItem;
|
||||||
BOOLEAN Success;
|
BOOLEAN Success;
|
||||||
|
|
||||||
WorkItem = malloc(sizeof *WorkItem + Request->Size);
|
WorkItem = MemAlloc(sizeof *WorkItem + Request->Size);
|
||||||
if (0 == WorkItem)
|
if (0 == WorkItem)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ FSP_API NTSTATUS FspProcessRequestInPool(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
Success = QueueUserWorkItem(FspProcessRequestInPoolWorker, WorkItem, WT_EXECUTEDEFAULT);
|
Success = QueueUserWorkItem(FspProcessRequestInPoolWorker, WorkItem, WT_EXECUTEDEFAULT);
|
||||||
if (!Success)
|
if (!Success)
|
||||||
{
|
{
|
||||||
free(WorkItem);
|
MemFree(WorkItem);
|
||||||
return FspNtStatusFromWin32(GetLastError());
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user