mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-14 15:52:47 -05:00
dll: WIP
This commit is contained in:
70
src/dll/access.c
Normal file
70
src/dll/access.c
Normal file
@ -0,0 +1,70 @@
|
||||
/**
|
||||
* @file dll/access.c
|
||||
*
|
||||
* @copyright 2015 Bill Zissimopoulos
|
||||
*/
|
||||
|
||||
#include <dll/library.h>
|
||||
|
||||
static GENERIC_MAPPING FspFileGenericMapping =
|
||||
{
|
||||
.GenericRead = FILE_GENERIC_READ,
|
||||
.GenericWrite = FILE_GENERIC_WRITE,
|
||||
.GenericExecute = FILE_GENERIC_EXECUTE,
|
||||
.GenericAll = FILE_ALL_ACCESS,
|
||||
};
|
||||
|
||||
FSP_API PGENERIC_MAPPING FspGetFileGenericMapping(VOID)
|
||||
{
|
||||
return &FspFileGenericMapping;
|
||||
}
|
||||
|
||||
FSP_API NTSTATUS FspOpenAccessToken(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, PHANDLE PAccessToken)
|
||||
{
|
||||
return FspFsctlOpenAccessToken(FileSystem->VolumeHandle, Request->Hint, PAccessToken);
|
||||
}
|
||||
|
||||
#if 0
|
||||
FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, PUINT32 PGrantedAccess)
|
||||
{
|
||||
if (0 != FileSystem->AccessCheck)
|
||||
return FileSystem->AccessCheck(FileSystem, Request, PGrantedAccess);
|
||||
|
||||
NTSTATUS Result;
|
||||
PWSTR FileName = (PVOID)Request->Buffer;
|
||||
PSECURITY_DESCRIPTOR SecurityDescriptor = 0;
|
||||
HANDLE AccessToken = 0;
|
||||
DWORD PrivilegeSetLength;
|
||||
BOOLEAN AccessStatus;
|
||||
s
|
||||
*PGrantedAccess = 0;
|
||||
|
||||
SecurityDescriptor = MemAlloc(1024);
|
||||
if (0 == SecurityDescriptor)
|
||||
{
|
||||
Result = STATUS_INSUFFICIENT_RESOURCES;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
Result = FspGetSecurityDescriptor();
|
||||
|
||||
Result = FspOpenAccessToken(FileSystem, Request, &AccessToken);
|
||||
if (!NT_SUCCESS(Result))
|
||||
goto exit;
|
||||
|
||||
if (AccessCheck(&SecurityDescriptor, AccessToken, Request->Req.Create.DesiredAccess,
|
||||
&FspFileGenericMapping, 0, &PrivilegeSetLength, PGrantedAccess, &AccessStatus))
|
||||
Result = AccessStatus ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
|
||||
else
|
||||
Result = FspNtStatusFromWin32(GetLastError());
|
||||
|
||||
exit:
|
||||
if (0 != AccessToken)
|
||||
CloseHandle(AccessToken);
|
||||
MemFree(SecurityDescriptor);
|
||||
|
||||
return Result;
|
||||
}
|
||||
#endif
|
112
src/dll/create.c
Normal file
112
src/dll/create.c
Normal file
@ -0,0 +1,112 @@
|
||||
/**
|
||||
* @file dll/create.c
|
||||
*
|
||||
* @copyright 2015 Bill Zissimopoulos
|
||||
*/
|
||||
|
||||
#include <dll/library.h>
|
||||
|
||||
#if 0
|
||||
static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request)
|
||||
{
|
||||
NTSTATUS Result;
|
||||
DWORD GrantedAccess;
|
||||
PVOID File;
|
||||
FSP_FSCTL_TRANSACT_RSP Response;
|
||||
|
||||
Result = FspAccessCheck(FileSystem, Request, TRUE, &GrantedAccess);
|
||||
if (!NT_SUCCESS(Result))
|
||||
return FspSendResponseWithStatus(FileSystem, Request, Result);
|
||||
|
||||
Result = FileSystem->FileCreate(FileSystem, Request, &File);
|
||||
if (!NT_SUCCESS(Result))
|
||||
return FspSendResponseWithStatus(FileSystem, Request, Result);
|
||||
|
||||
/* !!!: set share access */
|
||||
|
||||
memset(&Response, 0, sizeof Response);
|
||||
Response.Size = sizeof Response;
|
||||
Response.Kind = Request->Kind;
|
||||
Response.Hint = Request->Hint;
|
||||
Response.IoStatus.Status = STATUS_SUCCESS;
|
||||
Response.IoStatus.Information = FILE_CREATED;
|
||||
Response.Rsp.Create.Opened.UserContext = (UINT_PTR)File;
|
||||
Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess;
|
||||
return FspSendResponse(FileSystem, &Response);
|
||||
}
|
||||
|
||||
static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request)
|
||||
{
|
||||
NTSTATUS Result;
|
||||
DWORD GrantedAccess;
|
||||
PVOID File;
|
||||
FSP_FSCTL_TRANSACT_RSP Response;
|
||||
|
||||
Result = FspAccessCheck(FileSystem, Request, FALSE, &GrantedAccess);
|
||||
if (!NT_SUCCESS(Result))
|
||||
return FspSendResponseWithStatus(FileSystem, Request, Result);
|
||||
|
||||
Result = FileSystem->FileOpen(FileSystem, Request, &File);
|
||||
if (!NT_SUCCESS(Result))
|
||||
return FspSendResponseWithStatus(FileSystem, Request, Result);
|
||||
|
||||
Result = FspShareCheck(FileSystem, Request, GrantedAccess, File);
|
||||
if (!NT_SUCCESS(Result))
|
||||
{
|
||||
FileSystem->FileCleanupClose(FileSystem, Request, File);
|
||||
return FspSendResponseWithStatus(FileSystem, Request, Result);
|
||||
}
|
||||
|
||||
memset(&Response, 0, sizeof Response);
|
||||
Response.Size = sizeof Response;
|
||||
Response.Kind = Request->Kind;
|
||||
Response.Hint = Request->Hint;
|
||||
Response.IoStatus.Status = STATUS_SUCCESS;
|
||||
Response.IoStatus.Information = FILE_CREATED;
|
||||
Response.Rsp.Create.Opened.UserContext = (UINT_PTR)File;
|
||||
Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess;
|
||||
return FspSendResponse(FileSystem, &Response);
|
||||
}
|
||||
|
||||
static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request)
|
||||
{
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN Supersede)
|
||||
{
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request)
|
||||
{
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem,
|
||||
FSP_FSCTL_TRANSACT_REQ *Request)
|
||||
{
|
||||
switch ((Request->Req.Create.CreateOptions >> 24) & 0xff)
|
||||
{
|
||||
case FILE_CREATE:
|
||||
return FspFileSystemOpCreate_FileCreate(FileSystem, Request);
|
||||
case FILE_OPEN:
|
||||
return FspFileSystemOpCreate_FileOpen(FileSystem, Request);
|
||||
case FILE_OPEN_IF:
|
||||
return FspFileSystemOpCreate_FileOpenIf(FileSystem, Request);
|
||||
case FILE_OVERWRITE:
|
||||
return FspFileSystemOpCreate_FileOverwrite(FileSystem, Request, FALSE);
|
||||
case FILE_SUPERSEDE:
|
||||
return FspFileSystemOpCreate_FileOverwrite(FileSystem, Request, TRUE);
|
||||
case FILE_OVERWRITE_IF:
|
||||
return FspFileSystemOpCreate_FileOverwriteIf(FileSystem, Request);
|
||||
default:
|
||||
return FspSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_PARAMETER);
|
||||
}
|
||||
}
|
||||
#endif
|
@ -109,3 +109,11 @@ FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
|
||||
exit:
|
||||
return Result;
|
||||
}
|
||||
|
||||
FSP_API NTSTATUS FspFsctlOpenAccessToken(HANDLE VolumeHandle,
|
||||
UINT64 Hint, PHANDLE PAccessToken)
|
||||
{
|
||||
*PAccessToken = 0;
|
||||
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
56
src/dll/path.c
Normal file
56
src/dll/path.c
Normal file
@ -0,0 +1,56 @@
|
||||
/**
|
||||
* @file dll/path.c
|
||||
*
|
||||
* @copyright 2015 Bill Zissimopoulos
|
||||
*/
|
||||
|
||||
#include <dll/library.h>
|
||||
|
||||
FSP_API VOID FspPathPrefix(PWSTR Path, PWSTR *PPrefix, PWSTR *PRemain)
|
||||
{
|
||||
PWSTR Pointer;
|
||||
|
||||
for (Pointer = Path; *Pointer; Pointer++)
|
||||
if (L'\\' == *Pointer)
|
||||
{
|
||||
*Pointer++ = L'\0';
|
||||
for (; L'\\' == *Pointer; Pointer++)
|
||||
;
|
||||
break;
|
||||
}
|
||||
|
||||
*PPrefix = Path;
|
||||
*PRemain = Pointer;
|
||||
}
|
||||
|
||||
FSP_API VOID FspPathSuffix(PWSTR Path, PWSTR *PRemain, PWSTR *PSuffix)
|
||||
{
|
||||
PWSTR Pointer, RemainEnd, Suffix = 0;
|
||||
|
||||
for (Pointer = Path; *Pointer;)
|
||||
if (L'\\' == *Pointer)
|
||||
{
|
||||
RemainEnd = Pointer++;
|
||||
for (; L'\\' == *Pointer; Pointer++)
|
||||
;
|
||||
Suffix = Pointer;
|
||||
}
|
||||
else
|
||||
Pointer++;
|
||||
|
||||
*PRemain = Path;
|
||||
if (Path < Suffix)
|
||||
{
|
||||
*RemainEnd = L'\0';
|
||||
*PSuffix = Suffix;
|
||||
}
|
||||
else
|
||||
*PSuffix = Pointer;
|
||||
}
|
||||
|
||||
FSP_API VOID FspPathCombine(PWSTR Prefix, PWSTR Suffix)
|
||||
{
|
||||
for (; Prefix < Suffix; Prefix++)
|
||||
if (L'\0' == *Prefix)
|
||||
*Prefix = L'\\';
|
||||
}
|
Reference in New Issue
Block a user