├── .github └── FUNDING.yml ├── img ├── Thumbs.db └── pipe.webp ├── IoDllProxyLoad ├── .vs │ └── IoDllProxyLoad │ │ ├── v17 │ │ ├── .suo │ │ └── DocumentLayout.json │ │ └── FileContentIndex │ │ ├── 15cff572-bff7-4873-ac27-64f16ec32878.vsidx │ │ ├── 44b47aa5-c8fb-42d4-8bfb-b9143023cae5.vsidx │ │ └── b3b85c2a-761d-4a32-b5d4-dbeaac504a6e.vsidx ├── IoDllProxyLoad │ └── x64 │ │ └── Release │ │ ├── Main.obj │ │ ├── vc143.pdb │ │ ├── Assembly.obj │ │ ├── IoDllProxyLoad.iobj │ │ ├── IoDllProxyLoad.ipdb │ │ ├── IoDllProxyLoad.tlog │ │ ├── Cl.items.tlog │ │ ├── CL.read.1.tlog │ │ ├── CL.write.1.tlog │ │ ├── link.read.1.tlog │ │ ├── CL.command.1.tlog │ │ ├── Masm.read.1u.tlog │ │ ├── Masm.write.1u.tlog │ │ ├── link.command.1.tlog │ │ ├── link.write.1.tlog │ │ ├── IoDllProxyLoad.lastbuildstate │ │ └── link.secondary.1.tlog │ │ ├── IoDllProxyLoad.exe.recipe │ │ └── IoDllProxyLoad.log ├── IoDllProxyLoad.vcxproj.user ├── Assembly.asm ├── IoDllProxyLoad.vcxproj.filters ├── IoDllProxyLoad.sln ├── Main.cpp └── IoDllProxyLoad.vcxproj ├── README.md └── LICENSE.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: fin3ss3g0d 2 | -------------------------------------------------------------------------------- /img/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/img/Thumbs.db -------------------------------------------------------------------------------- /img/pipe.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/img/pipe.webp -------------------------------------------------------------------------------- /IoDllProxyLoad/.vs/IoDllProxyLoad/v17/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/.vs/IoDllProxyLoad/v17/.suo -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/Main.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/Main.obj -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/vc143.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/vc143.pdb -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/Assembly.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/Assembly.obj -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.iobj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.iobj -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.ipdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.ipdb -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/Cl.items.tlog: -------------------------------------------------------------------------------- 1 | Y:\Github\IoDllProxyLoad\IoDllProxyLoad\Main.cpp;Y:\Github\IoDllProxyLoad\IoDllProxyLoad\IoDllProxyLoad\x64\Release\Main.obj 2 | -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/CL.read.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/CL.read.1.tlog -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad.vcxproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/CL.write.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/CL.write.1.tlog -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/link.read.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/link.read.1.tlog -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/CL.command.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/CL.command.1.tlog -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/Masm.read.1u.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/Masm.read.1u.tlog -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/Masm.write.1u.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/Masm.write.1u.tlog -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/link.command.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/link.command.1.tlog -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/link.write.1.tlog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/link.write.1.tlog -------------------------------------------------------------------------------- /IoDllProxyLoad/.vs/IoDllProxyLoad/FileContentIndex/15cff572-bff7-4873-ac27-64f16ec32878.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/.vs/IoDllProxyLoad/FileContentIndex/15cff572-bff7-4873-ac27-64f16ec32878.vsidx -------------------------------------------------------------------------------- /IoDllProxyLoad/.vs/IoDllProxyLoad/FileContentIndex/44b47aa5-c8fb-42d4-8bfb-b9143023cae5.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/.vs/IoDllProxyLoad/FileContentIndex/44b47aa5-c8fb-42d4-8bfb-b9143023cae5.vsidx -------------------------------------------------------------------------------- /IoDllProxyLoad/.vs/IoDllProxyLoad/FileContentIndex/b3b85c2a-761d-4a32-b5d4-dbeaac504a6e.vsidx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fin3ss3g0d/IoDllProxyLoad/HEAD/IoDllProxyLoad/.vs/IoDllProxyLoad/FileContentIndex/b3b85c2a-761d-4a32-b5d4-dbeaac504a6e.vsidx -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/IoDllProxyLoad.lastbuildstate: -------------------------------------------------------------------------------- 1 | PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.39.33519:TargetPlatformVersion=10.0.22621.0: 2 | Release|x64|Y:\Github\IoDllProxyLoad\IoDllProxyLoad\| 3 | -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.exe.recipe: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Y:\Github\IoDllProxyLoad\IoDllProxyLoad\x64\Release\IoDllProxyLoad.exe 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.tlog/link.secondary.1.tlog: -------------------------------------------------------------------------------- 1 | ^Y:\GITHUB\IODLLPROXYLOAD\IODLLPROXYLOAD\IODLLPROXYLOAD\X64\RELEASE\ASSEMBLY.OBJ|Y:\GITHUB\IODLLPROXYLOAD\IODLLPROXYLOAD\IODLLPROXYLOAD\X64\RELEASE\MAIN.OBJ 2 | Y:\Github\IoDllProxyLoad\IoDllProxyLoad\IoDllProxyLoad\x64\Release\IoDllProxyLoad.IPDB 3 | Y:\Github\IoDllProxyLoad\IoDllProxyLoad\IoDllProxyLoad\x64\Release\IoDllProxyLoad.iobj 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![pipe](img/pipe.webp) 2 | 3 | # IoDllProxyLoad 4 | 5 | This project is an example of weaponizing the Windows thread pool API to proxy the loading of a DLL through an I/O completion callback function utilizing named pipes and C++/assembly to produce a clean stack for the DLL load. I wrote a detailed blog about this project [here](https://fin3ss3g0d.net/index.php/2024/03/18/weaponizing-windows-thread-pool-apis-proxying-dll-loads/). -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad/x64/Release/IoDllProxyLoad.log: -------------------------------------------------------------------------------- 1 | Assembling Assembly.asm... 2 | Main.cpp 3 | Y:\Github\IoDllProxyLoad\IoDllProxyLoad\Main.cpp(14,2): warning C4091: 'typedef ': ignored on left of 'LOAD_CONTEXT' when no variable is declared 4 | Generating code 5 | Previous IPDB not found, fall back to full compilation. 6 | All 6 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. 7 | Finished generating code 8 | IoDllProxyLoad.vcxproj -> Y:\Github\IoDllProxyLoad\IoDllProxyLoad\x64\Release\IoDllProxyLoad.exe 9 | -------------------------------------------------------------------------------- /IoDllProxyLoad/Assembly.asm: -------------------------------------------------------------------------------- 1 | .CODE 2 | 3 | ; LOAD_CONTEXT* is passed in RDX 4 | IoCompletionCallback PROC 5 | ; Extract the 'DllName' member (first member of the structure) to RCX 6 | mov rcx, [rdx] ; Moves the address pointed to by DllName into RCX 7 | 8 | ; Extract the 'pLoadLibraryA' member (second member of the structure) into RAX 9 | mov rax, [rdx + 8] ; Assumes 64-bit pointers, so offset is 8 bytes 10 | 11 | ; Now RCX contains the address of the dll string, 12 | ; and RAX contains the address to jump to (pLoadLibraryA) 13 | 14 | xor rdx, rdx ; Clear RDX 15 | 16 | ; Jump to LoadLibraryA address, avoiding call instruction and return address placement on stack 17 | jmp rax 18 | IoCompletionCallback ENDP 19 | 20 | END -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Dylan Evans 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Source Files 25 | 26 | 27 | -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.9.34622.214 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IoDllProxyLoad", "IoDllProxyLoad.vcxproj", "{526615FC-0837-4DC9-BE5B-EC2B3683D74F}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {526615FC-0837-4DC9-BE5B-EC2B3683D74F}.Debug|x64.ActiveCfg = Debug|x64 17 | {526615FC-0837-4DC9-BE5B-EC2B3683D74F}.Debug|x64.Build.0 = Debug|x64 18 | {526615FC-0837-4DC9-BE5B-EC2B3683D74F}.Debug|x86.ActiveCfg = Debug|Win32 19 | {526615FC-0837-4DC9-BE5B-EC2B3683D74F}.Debug|x86.Build.0 = Debug|Win32 20 | {526615FC-0837-4DC9-BE5B-EC2B3683D74F}.Release|x64.ActiveCfg = Release|x64 21 | {526615FC-0837-4DC9-BE5B-EC2B3683D74F}.Release|x64.Build.0 = Release|x64 22 | {526615FC-0837-4DC9-BE5B-EC2B3683D74F}.Release|x86.ActiveCfg = Release|Win32 23 | {526615FC-0837-4DC9-BE5B-EC2B3683D74F}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {9143F49E-ADBE-4911-9E5B-9B80C19ECA64} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /IoDllProxyLoad/.vs/IoDllProxyLoad/v17/DocumentLayout.json: -------------------------------------------------------------------------------- 1 | { 2 | "Version": 1, 3 | "WorkspaceRootPath": "Y:\\Github\\IoDllProxyLoad\\IoDllProxyLoad\\", 4 | "Documents": [ 5 | { 6 | "AbsoluteMoniker": "D:0:0:{526615FC-0837-4DC9-BE5B-EC2B3683D74F}|IoDllProxyLoad.vcxproj|Y:\\Github\\IoDllProxyLoad\\IoDllProxyLoad\\Assembly.asm||{8B382828-6202-11D1-8870-0000F87579D2}", 7 | "RelativeMoniker": "D:0:0:{526615FC-0837-4DC9-BE5B-EC2B3683D74F}|IoDllProxyLoad.vcxproj|solutionrelative:Assembly.asm||{8B382828-6202-11D1-8870-0000F87579D2}" 8 | }, 9 | { 10 | "AbsoluteMoniker": "D:0:0:{526615FC-0837-4DC9-BE5B-EC2B3683D74F}|IoDllProxyLoad.vcxproj|Y:\\Github\\IoDllProxyLoad\\IoDllProxyLoad\\Main.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}", 11 | "RelativeMoniker": "D:0:0:{526615FC-0837-4DC9-BE5B-EC2B3683D74F}|IoDllProxyLoad.vcxproj|solutionrelative:Main.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" 12 | } 13 | ], 14 | "DocumentGroupContainers": [ 15 | { 16 | "Orientation": 0, 17 | "VerticalTabListWidth": 256, 18 | "DocumentGroups": [ 19 | { 20 | "DockedWidth": 200, 21 | "SelectedChildIndex": 0, 22 | "Children": [ 23 | { 24 | "$type": "Document", 25 | "DocumentIndex": 0, 26 | "Title": "Assembly.asm", 27 | "DocumentMoniker": "Y:\\Github\\IoDllProxyLoad\\IoDllProxyLoad\\Assembly.asm", 28 | "RelativeDocumentMoniker": "Assembly.asm", 29 | "ToolTip": "Y:\\Github\\IoDllProxyLoad\\IoDllProxyLoad\\Assembly.asm", 30 | "RelativeToolTip": "Assembly.asm", 31 | "ViewState": "AQIAAAAAAAAAAAAAAAAAABAAAAAAAAAA", 32 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", 33 | "WhenOpened": "2024-03-18T19:47:26.694Z", 34 | "EditorCaption": "" 35 | }, 36 | { 37 | "$type": "Document", 38 | "DocumentIndex": 1, 39 | "Title": "Main.cpp", 40 | "DocumentMoniker": "Y:\\Github\\IoDllProxyLoad\\IoDllProxyLoad\\Main.cpp", 41 | "RelativeDocumentMoniker": "Main.cpp", 42 | "ToolTip": "Y:\\Github\\IoDllProxyLoad\\IoDllProxyLoad\\Main.cpp", 43 | "RelativeToolTip": "Main.cpp", 44 | "ViewState": "AQIAAAAAAAAAAAAAAAAAACMAAAAFAAAA", 45 | "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", 46 | "WhenOpened": "2024-03-18T19:46:30.295Z", 47 | "EditorCaption": "" 48 | } 49 | ] 50 | } 51 | ] 52 | } 53 | ] 54 | } -------------------------------------------------------------------------------- /IoDllProxyLoad/Main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | extern "C" void CALLBACK IoCompletionCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PVOID Overlapped, ULONG IoResult, ULONG_PTR NumberOfBytesTransferred, PTP_IO Io); 5 | void StartRead(HANDLE pipe, PTP_IO tpIo, OVERLAPPED* overlapped, char* buffer); 6 | void CALLBACK ClientWorkCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work); 7 | 8 | PVOID pLoadLibraryA; 9 | HANDLE g_WriteCompleteEvent; // Global event to signal completion of write operation 10 | 11 | typedef struct LOAD_CONTEXT { 12 | char* DllName; 13 | PVOID pLoadLibraryA; 14 | }; 15 | 16 | int main() 17 | { 18 | HANDLE pipe; 19 | PTP_IO tpIo = NULL; 20 | OVERLAPPED overlapped = { 0 }; 21 | char buffer[128] = { 0 }; 22 | 23 | // Get the address of LoadLibraryA 24 | pLoadLibraryA = GetProcAddress(GetModuleHandleA("kernel32"), "LoadLibraryA"); 25 | 26 | // Prepare the LOAD_CONTEXT structure 27 | LOAD_CONTEXT loadContext; 28 | loadContext.DllName = (char*)"wininet.dll"; 29 | loadContext.pLoadLibraryA = pLoadLibraryA; 30 | 31 | // Create a global event to signal when the write operation is complete 32 | g_WriteCompleteEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 33 | if (g_WriteCompleteEvent == NULL) { 34 | printf("Failed to create write complete event\n"); 35 | return 1; 36 | } 37 | 38 | // Create a named pipe with FILE_FLAG_OVERLAPPED flag 39 | pipe = CreateNamedPipe( 40 | TEXT("\\\\.\\pipe\\MyPipe"), 41 | PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 42 | PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 43 | 1, // Number of instances 44 | 4096, // Out buffer size 45 | 4096, // In buffer size 46 | 0, // Timeout in milliseconds 47 | NULL); // Default security attributes 48 | 49 | if (pipe == INVALID_HANDLE_VALUE) { 50 | printf("Failed to create named pipe\n"); 51 | CloseHandle(g_WriteCompleteEvent); 52 | return 1; 53 | } 54 | 55 | // Create an event for the OVERLAPPED structure 56 | overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 57 | if (overlapped.hEvent == NULL) { 58 | printf("Failed to create event\n"); 59 | CloseHandle(pipe); 60 | CloseHandle(g_WriteCompleteEvent); 61 | return 1; 62 | } 63 | 64 | // Associate the pipe with the thread pool 65 | tpIo = CreateThreadpoolIo(pipe, IoCompletionCallback, &loadContext, NULL); 66 | if (tpIo == NULL) { 67 | printf("Failed to associate pipe with thread pool\n"); 68 | CloseHandle(overlapped.hEvent); 69 | CloseHandle(pipe); 70 | CloseHandle(g_WriteCompleteEvent); 71 | return 1; 72 | } 73 | 74 | // Create threadpool work item for the client code 75 | PTP_WORK clientWork = CreateThreadpoolWork(ClientWorkCallback, NULL, NULL); 76 | if (clientWork == NULL) { 77 | printf("Failed to create threadpool work item\n"); 78 | CloseThreadpoolIo(tpIo); 79 | CloseHandle(overlapped.hEvent); 80 | CloseHandle(pipe); 81 | CloseHandle(g_WriteCompleteEvent); 82 | return 1; 83 | } 84 | 85 | // Submit the client work item to the thread pool 86 | SubmitThreadpoolWork(clientWork); 87 | 88 | // Wait for the client work item to signal that the write operation is complete 89 | WaitForSingleObject(g_WriteCompleteEvent, INFINITE); 90 | 91 | // Start an asynchronous read operation 92 | StartRead(pipe, tpIo, &overlapped, buffer); 93 | printf("Pipe buffer: %s\n", buffer); 94 | 95 | // Wait for the read operation to complete 96 | WaitForSingleObject(overlapped.hEvent, INFINITE); 97 | 98 | // Wait for client work to complete 99 | WaitForThreadpoolWorkCallbacks(clientWork, FALSE); 100 | CloseThreadpoolWork(clientWork); 101 | 102 | // Cleanup 103 | CloseThreadpoolIo(tpIo); 104 | CloseHandle(overlapped.hEvent); 105 | CloseHandle(pipe); 106 | CloseHandle(g_WriteCompleteEvent); 107 | 108 | printf("wininet.dll should be loaded! Input any key to exit...\n"); 109 | getchar(); 110 | 111 | return 0; 112 | } 113 | 114 | void StartRead(HANDLE pipe, PTP_IO tpIo, OVERLAPPED* overlapped, char* buffer) 115 | { 116 | DWORD bytesRead = 0; 117 | StartThreadpoolIo(tpIo); 118 | if (!ReadFile(pipe, buffer, 128, &bytesRead, overlapped) && GetLastError() != ERROR_IO_PENDING) { 119 | printf("ReadFile failed, error %lu\n", GetLastError()); 120 | CancelThreadpoolIo(tpIo); 121 | } 122 | } 123 | 124 | void CALLBACK ClientWorkCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work) 125 | { 126 | // Open the named pipe 127 | HANDLE pipe = CreateFile( 128 | TEXT("\\\\.\\pipe\\MyPipe"), 129 | GENERIC_WRITE, 130 | 0, 131 | NULL, 132 | OPEN_EXISTING, 133 | FILE_ATTRIBUTE_NORMAL, 134 | NULL); 135 | 136 | if (pipe == INVALID_HANDLE_VALUE) { 137 | printf("Client failed to connect to pipe\n"); 138 | return; 139 | } 140 | 141 | const char message[] = "Hello from the pipe!"; 142 | DWORD bytesWritten; 143 | if (!WriteFile(pipe, message, sizeof(message), &bytesWritten, NULL)) { 144 | printf("Client WriteFile failed, error: %lu\n", GetLastError()); 145 | } 146 | else { 147 | printf("Client wrote to pipe\n"); 148 | } 149 | 150 | // Signal that the write operation is complete 151 | SetEvent(g_WriteCompleteEvent); 152 | 153 | CloseHandle(pipe); 154 | } 155 | -------------------------------------------------------------------------------- /IoDllProxyLoad/IoDllProxyLoad.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 17.0 23 | Win32Proj 24 | {526615fc-0837-4dc9-be5b-ec2b3683d74f} 25 | IoDllProxyLoad 26 | 10.0 27 | 28 | 29 | 30 | Application 31 | true 32 | v143 33 | Unicode 34 | 35 | 36 | Application 37 | false 38 | v143 39 | true 40 | Unicode 41 | 42 | 43 | Application 44 | true 45 | v143 46 | Unicode 47 | 48 | 49 | Application 50 | false 51 | v143 52 | true 53 | Unicode 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | Level3 77 | true 78 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 79 | true 80 | 81 | 82 | Console 83 | true 84 | 85 | 86 | 87 | 88 | Level3 89 | true 90 | true 91 | true 92 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 93 | true 94 | 95 | 96 | Console 97 | true 98 | true 99 | true 100 | 101 | 102 | 103 | 104 | Level3 105 | true 106 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions) 107 | true 108 | 109 | 110 | Console 111 | true 112 | 113 | 114 | 115 | 116 | Level3 117 | true 118 | true 119 | true 120 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 121 | true 122 | 123 | 124 | Console 125 | true 126 | true 127 | true 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | --------------------------------------------------------------------------------