├── .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 | 
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 |
--------------------------------------------------------------------------------