tst: winfsp-tests: add oplock option

This commit is contained in:
Bill Zissimopoulos 2016-11-19 22:58:40 -08:00
parent aa23672b01
commit 53f60a698a
3 changed files with 86 additions and 0 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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[];