mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 00:43:00 -05:00
tst: winfsp-tests: add oplock option
This commit is contained in:
parent
aa23672b01
commit
53f60a698a
@ -103,6 +103,78 @@ static VOID PrepareFileName(PCWSTR FileName, PWSTR FileNameBuf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
HANDLE File;
|
||||||
|
HANDLE Wait;
|
||||||
|
OVERLAPPED Overlapped;
|
||||||
|
} OPLOCK_BREAK_WAIT_DATA;
|
||||||
|
|
||||||
|
static VOID CALLBACK OplockBreakWait(PVOID Context, BOOLEAN Timeout)
|
||||||
|
{
|
||||||
|
OPLOCK_BREAK_WAIT_DATA *Data = Context;
|
||||||
|
|
||||||
|
UnregisterWaitEx(Data->Wait, 0);
|
||||||
|
CloseHandle(Data->File);
|
||||||
|
HeapFree(GetProcessHeap(), 0, Data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID MaybeRequestOplock(PCWSTR FileName)
|
||||||
|
{
|
||||||
|
HANDLE File;
|
||||||
|
OPLOCK_BREAK_WAIT_DATA *Data;
|
||||||
|
DWORD FsControlCode;
|
||||||
|
BOOL Success;
|
||||||
|
DWORD BytesTransferred;
|
||||||
|
|
||||||
|
if (0 == OptOplock)
|
||||||
|
return;
|
||||||
|
|
||||||
|
File = CreateFileW(
|
||||||
|
FileName,
|
||||||
|
FILE_READ_ATTRIBUTES | SYNCHRONIZE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
|
0,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_FLAG_OVERLAPPED,
|
||||||
|
0);
|
||||||
|
if (INVALID_HANDLE_VALUE == File)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Data = HeapAlloc(GetProcessHeap(), 0, sizeof *Data);
|
||||||
|
if (0 == Data)
|
||||||
|
ABORT("cannot malloc filter oplock data");
|
||||||
|
memset(Data, 0, sizeof *Data);
|
||||||
|
|
||||||
|
switch (OptOplock)
|
||||||
|
{
|
||||||
|
case 'B':
|
||||||
|
FsControlCode = FSCTL_REQUEST_BATCH_OPLOCK;
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
FsControlCode = FSCTL_REQUEST_FILTER_OPLOCK;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FsControlCode = FSCTL_REQUEST_FILTER_OPLOCK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Success = DeviceIoControl(File, FsControlCode, 0, 0, 0, 0, &BytesTransferred,
|
||||||
|
&Data->Overlapped);
|
||||||
|
if (!Success && ERROR_IO_PENDING == GetLastError())
|
||||||
|
{
|
||||||
|
Data->File = File;
|
||||||
|
if (!RegisterWaitForSingleObject(&Data->Wait, File,
|
||||||
|
OplockBreakWait, Data, INFINITE, WT_EXECUTEONLYONCE))
|
||||||
|
ABORT("cannot register wait for filter oplock");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CloseHandle(File);
|
||||||
|
HeapFree(GetProcessHeap(), 0, Data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static VOID MaybeAdjustTraversePrivilege(BOOL Enable)
|
static VOID MaybeAdjustTraversePrivilege(BOOL Enable)
|
||||||
{
|
{
|
||||||
if (OptNoTraverseToken)
|
if (OptNoTraverseToken)
|
||||||
@ -134,6 +206,8 @@ HANDLE WINAPI HookCreateFileW(
|
|||||||
|
|
||||||
PrepareFileName(lpFileName, FileNameBuf);
|
PrepareFileName(lpFileName, FileNameBuf);
|
||||||
|
|
||||||
|
MaybeRequestOplock(lpFileName);
|
||||||
|
|
||||||
MaybeAdjustTraversePrivilege(FALSE);
|
MaybeAdjustTraversePrivilege(FALSE);
|
||||||
Handle = (OptResilient ? ResilientCreateFileW : CreateFileW)(
|
Handle = (OptResilient ? ResilientCreateFileW : CreateFileW)(
|
||||||
FileNameBuf,
|
FileNameBuf,
|
||||||
|
@ -31,6 +31,7 @@ int WinFspNetTests = 1;
|
|||||||
BOOLEAN OptResilient = FALSE;
|
BOOLEAN OptResilient = FALSE;
|
||||||
BOOLEAN OptCaseInsensitive = FALSE;
|
BOOLEAN OptCaseInsensitive = FALSE;
|
||||||
BOOLEAN OptCaseRandomize = FALSE;
|
BOOLEAN OptCaseRandomize = FALSE;
|
||||||
|
WCHAR OptOplock = 0;
|
||||||
WCHAR OptMountPointBuf[MAX_PATH], *OptMountPoint;
|
WCHAR OptMountPointBuf[MAX_PATH], *OptMountPoint;
|
||||||
WCHAR OptShareNameBuf[MAX_PATH], *OptShareName, *OptShareTarget;
|
WCHAR OptShareNameBuf[MAX_PATH], *OptShareName, *OptShareTarget;
|
||||||
WCHAR OptShareComputer[MAX_PATH] = L"\\\\localhost\\";
|
WCHAR OptShareComputer[MAX_PATH] = L"\\\\localhost\\";
|
||||||
@ -226,6 +227,16 @@ int main(int argc, char *argv[])
|
|||||||
OptCaseInsensitive = TRUE;
|
OptCaseInsensitive = TRUE;
|
||||||
rmarg(argv, argc, argi);
|
rmarg(argv, argc, argi);
|
||||||
}
|
}
|
||||||
|
else if (0 == strcmp("--oplock=batch", a))
|
||||||
|
{
|
||||||
|
OptOplock = 'B';
|
||||||
|
rmarg(argv, argc, argi);
|
||||||
|
}
|
||||||
|
else if (0 == strcmp("--oplock=filter", a))
|
||||||
|
{
|
||||||
|
OptOplock = 'F';
|
||||||
|
rmarg(argv, argc, argi);
|
||||||
|
}
|
||||||
else if (0 == strncmp("--mountpoint=", a, sizeof "--mountpoint=" - 1))
|
else if (0 == strncmp("--mountpoint=", a, sizeof "--mountpoint=" - 1))
|
||||||
{
|
{
|
||||||
if (0 != MultiByteToWideChar(CP_UTF8, 0,
|
if (0 != MultiByteToWideChar(CP_UTF8, 0,
|
||||||
|
@ -140,6 +140,7 @@ extern int WinFspNetTests;
|
|||||||
extern BOOLEAN OptResilient;
|
extern BOOLEAN OptResilient;
|
||||||
extern BOOLEAN OptCaseInsensitive;
|
extern BOOLEAN OptCaseInsensitive;
|
||||||
extern BOOLEAN OptCaseRandomize;
|
extern BOOLEAN OptCaseRandomize;
|
||||||
|
extern WCHAR OptOplock;
|
||||||
extern WCHAR OptMountPointBuf[], *OptMountPoint;
|
extern WCHAR OptMountPointBuf[], *OptMountPoint;
|
||||||
extern WCHAR OptShareNameBuf[], *OptShareName, *OptShareTarget;
|
extern WCHAR OptShareNameBuf[], *OptShareName, *OptShareTarget;
|
||||||
extern WCHAR OptShareComputer[];
|
extern WCHAR OptShareComputer[];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user