mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -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)
|
||||
{
|
||||
if (OptNoTraverseToken)
|
||||
@ -134,6 +206,8 @@ HANDLE WINAPI HookCreateFileW(
|
||||
|
||||
PrepareFileName(lpFileName, FileNameBuf);
|
||||
|
||||
MaybeRequestOplock(lpFileName);
|
||||
|
||||
MaybeAdjustTraversePrivilege(FALSE);
|
||||
Handle = (OptResilient ? ResilientCreateFileW : CreateFileW)(
|
||||
FileNameBuf,
|
||||
|
@ -31,6 +31,7 @@ int WinFspNetTests = 1;
|
||||
BOOLEAN OptResilient = FALSE;
|
||||
BOOLEAN OptCaseInsensitive = FALSE;
|
||||
BOOLEAN OptCaseRandomize = FALSE;
|
||||
WCHAR OptOplock = 0;
|
||||
WCHAR OptMountPointBuf[MAX_PATH], *OptMountPoint;
|
||||
WCHAR OptShareNameBuf[MAX_PATH], *OptShareName, *OptShareTarget;
|
||||
WCHAR OptShareComputer[MAX_PATH] = L"\\\\localhost\\";
|
||||
@ -226,6 +227,16 @@ int main(int argc, char *argv[])
|
||||
OptCaseInsensitive = TRUE;
|
||||
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))
|
||||
{
|
||||
if (0 != MultiByteToWideChar(CP_UTF8, 0,
|
||||
|
@ -140,6 +140,7 @@ extern int WinFspNetTests;
|
||||
extern BOOLEAN OptResilient;
|
||||
extern BOOLEAN OptCaseInsensitive;
|
||||
extern BOOLEAN OptCaseRandomize;
|
||||
extern WCHAR OptOplock;
|
||||
extern WCHAR OptMountPointBuf[], *OptMountPoint;
|
||||
extern WCHAR OptShareNameBuf[], *OptShareName, *OptShareTarget;
|
||||
extern WCHAR OptShareComputer[];
|
||||
|
Loading…
x
Reference in New Issue
Block a user