This commit is contained in:
Bill Zissimopoulos
2015-12-31 22:53:17 -08:00
parent 8e2ed419f0
commit 223b287453
13 changed files with 391 additions and 2 deletions

70
src/dll/access.c Normal file
View 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
View 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

View File

@ -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
View 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'\\';
}