Skip to content

Commit

Permalink
Add mock layer to run native module test cases in user mode (microsof…
Browse files Browse the repository at this point in the history
…t#889)

* add mock layer to test native module load

* Apply suggestions from code review

Co-authored-by: Dave Thaler <dthaler@microsoft.com>

* make unit_test dependent on dll projects

Co-authored-by: Dave Thaler <dthaler@microsoft.com>
Co-authored-by: Alan Jowett <alanjo@microsoft.com>
3 people authored Apr 7, 2022
1 parent aeddcca commit 54516ec
Showing 14 changed files with 823 additions and 49 deletions.
108 changes: 85 additions & 23 deletions ebpf-for-windows.sln
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@ MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ebpfverifier", "external\ebpf-verifier\build\ebpfverifier.vcxproj", "{7D5B4E68-C0FA-3F86-9405-F6400219B440}"
ProjectSection(ProjectDependencies) = postProject
{231EE32B-EBA4-4FE5-A55B-DB18F539D403} = {231EE32B-EBA4-4FE5-A55B-DB18F539D403}
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA} = {A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A} = {98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libs", "libs", "{B02E60AE-1254-459C-8824-AC6CDB6AE52E}"
@@ -125,7 +125,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xdp_tests", "tests\xdp\xdp_
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bpftool", "tools\bpftool\bpftool.vcxproj", "{CA179B38-EBF5-4371-B830-73486E35250B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "yaml-cpp", "external\ebpf-verifier\build\yaml-cpp.vcxproj", "{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "yaml-cpp", "external\ebpf-verifier\build\yaml-cpp.vcxproj", "{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bpf2c", "tools\bpf2c\bpf2c.vcxproj", "{69B97E52-18DC-434E-A6E4-4C0F3E88C44A}"
EndProject
@@ -159,6 +159,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Catch2WithMain", "external\
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Catch2", "external\Catch2\build\src\Catch2.vcxproj", "{8D538CBE-01BF-4A2E-A98A-6C368FDF13D7}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bindmonitor_um", "tests\sample\generated\dll\bindmonitor_um\bindmonitor_dll.vcxproj", "{128660AB-71BD-480B-AB39-D1AB3AE811B5}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bindmonitor_tailcall_um", "tests\sample\generated\dll\bindmonitor_tailcall_um\bindmonitor_tailcall_dll.vcxproj", "{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM
@@ -1177,26 +1181,26 @@ Global
{CA179B38-EBF5-4371-B830-73486E35250B}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{CA179B38-EBF5-4371-B830-73486E35250B}.RelWithDebInfo|x64.Build.0 = Release|x64
{CA179B38-EBF5-4371-B830-73486E35250B}.RelWithDebInfo|x86.ActiveCfg = Debug|Win32
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Debug|ARM.ActiveCfg = Debug|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Debug|ARM64.ActiveCfg = Debug|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Debug|x64.ActiveCfg = Debug|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Debug|x64.Build.0 = Debug|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Debug|x86.ActiveCfg = Debug|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.MinSizeRel|ARM.ActiveCfg = MinSizeRel|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Release|ARM.ActiveCfg = Release|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Release|ARM64.ActiveCfg = Release|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Release|x64.ActiveCfg = Release|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Release|x64.Build.0 = Release|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.Release|x86.ActiveCfg = Release|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.RelWithDebInfo|ARM.ActiveCfg = RelWithDebInfo|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Debug|ARM.ActiveCfg = Debug|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Debug|ARM64.ActiveCfg = Debug|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Debug|x64.ActiveCfg = Debug|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Debug|x64.Build.0 = Debug|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Debug|x86.ActiveCfg = Debug|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.MinSizeRel|ARM.ActiveCfg = MinSizeRel|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Release|ARM.ActiveCfg = Release|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Release|ARM64.ActiveCfg = Release|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Release|x64.ActiveCfg = Release|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Release|x64.Build.0 = Release|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.Release|x86.ActiveCfg = Release|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.RelWithDebInfo|ARM.ActiveCfg = RelWithDebInfo|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
{69B97E52-18DC-434E-A6E4-4C0F3E88C44A}.Debug|ARM.ActiveCfg = Debug|Win32
{69B97E52-18DC-434E-A6E4-4C0F3E88C44A}.Debug|ARM64.ActiveCfg = Debug|Win32
{69B97E52-18DC-434E-A6E4-4C0F3E88C44A}.Debug|x64.ActiveCfg = Debug|x64
@@ -1493,6 +1497,62 @@ Global
{8D538CBE-01BF-4A2E-A98A-6C368FDF13D7}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{8D538CBE-01BF-4A2E-A98A-6C368FDF13D7}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
{8D538CBE-01BF-4A2E-A98A-6C368FDF13D7}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Debug|ARM.ActiveCfg = Debug|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Debug|ARM64.ActiveCfg = Debug|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Debug|x64.ActiveCfg = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Debug|x64.Build.0 = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Debug|x86.ActiveCfg = Debug|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Debug|x86.Build.0 = Debug|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.MinSizeRel|ARM.ActiveCfg = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.MinSizeRel|ARM.Build.0 = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.MinSizeRel|ARM64.ActiveCfg = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.MinSizeRel|ARM64.Build.0 = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.MinSizeRel|x64.ActiveCfg = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.MinSizeRel|x64.Build.0 = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.MinSizeRel|x86.ActiveCfg = Debug|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.MinSizeRel|x86.Build.0 = Debug|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Release|ARM.ActiveCfg = Release|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Release|ARM64.ActiveCfg = Release|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Release|x64.ActiveCfg = Release|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Release|x64.Build.0 = Release|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Release|x86.ActiveCfg = Release|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.Release|x86.Build.0 = Release|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.RelWithDebInfo|ARM.ActiveCfg = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.RelWithDebInfo|ARM.Build.0 = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.RelWithDebInfo|ARM64.ActiveCfg = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.RelWithDebInfo|ARM64.Build.0 = Debug|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.RelWithDebInfo|x64.Build.0 = Release|x64
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
{128660AB-71BD-480B-AB39-D1AB3AE811B5}.RelWithDebInfo|x86.Build.0 = Release|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Debug|ARM.ActiveCfg = Debug|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Debug|ARM64.ActiveCfg = Debug|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Debug|x64.ActiveCfg = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Debug|x64.Build.0 = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Debug|x86.ActiveCfg = Debug|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Debug|x86.Build.0 = Debug|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.MinSizeRel|ARM.ActiveCfg = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.MinSizeRel|ARM.Build.0 = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.MinSizeRel|ARM64.ActiveCfg = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.MinSizeRel|ARM64.Build.0 = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.MinSizeRel|x64.ActiveCfg = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.MinSizeRel|x64.Build.0 = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.MinSizeRel|x86.ActiveCfg = Debug|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.MinSizeRel|x86.Build.0 = Debug|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Release|ARM.ActiveCfg = Release|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Release|ARM64.ActiveCfg = Release|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Release|x64.ActiveCfg = Release|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Release|x64.Build.0 = Release|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Release|x86.ActiveCfg = Release|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.Release|x86.Build.0 = Release|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.RelWithDebInfo|ARM.ActiveCfg = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.RelWithDebInfo|ARM.Build.0 = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.RelWithDebInfo|ARM64.ActiveCfg = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.RelWithDebInfo|ARM64.Build.0 = Debug|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.RelWithDebInfo|x64.Build.0 = Release|x64
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881}.RelWithDebInfo|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1533,7 +1593,7 @@ Global
{724EB55A-CCFC-4662-92E3-B664CDA365E7} = {492C9B22-9237-4996-9E33-CA14D3533616}
{07DC6181-84A2-4A14-A806-5E9AF6C929C2} = {492C9B22-9237-4996-9E33-CA14D3533616}
{CA179B38-EBF5-4371-B830-73486E35250B} = {B09749EC-3D14-414B-BA9B-CD20E218DC84}
{A94F0C6F-3696-3BAF-AC6F-6D0684B8AFCA} = {69CDB6A1-434D-4BC9-9BFF-D12DF7EDBB6B}
{98D56B8A-D8EB-3D98-B8EE-C83696B4D58A} = {69CDB6A1-434D-4BC9-9BFF-D12DF7EDBB6B}
{69B97E52-18DC-434E-A6E4-4C0F3E88C44A} = {B09749EC-3D14-414B-BA9B-CD20E218DC84}
{61DF9973-81B9-4006-9148-52F58259BBCF} = {492C9B22-9237-4996-9E33-CA14D3533616}
{7FF318D8-5B95-4ACB-921D-4BBB71149938} = {492C9B22-9237-4996-9E33-CA14D3533616}
@@ -1546,6 +1606,8 @@ Global
{2B51E0EF-4589-430B-9CCC-D09A4E6FD8B2} = {5C9E1337-D8EF-41AB-815D-E1990D19E4E0}
{8BD3552A-2CFB-4A59-AB15-2031B97ADA1E} = {492C9B22-9237-4996-9E33-CA14D3533616}
{8D538CBE-01BF-4A2E-A98A-6C368FDF13D7} = {492C9B22-9237-4996-9E33-CA14D3533616}
{128660AB-71BD-480B-AB39-D1AB3AE811B5} = {54A59EC4-862D-4DEF-AB6B-4D69792FD212}
{FD1A4291-5BCA-4C11-916C-90BFEA2A1881} = {54A59EC4-862D-4DEF-AB6B-4D69792FD212}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3D5F862D-74C6-4357-9F95-0B152E33B7B8}
15 changes: 8 additions & 7 deletions libs/execution_context/ebpf_native.c
Original file line number Diff line number Diff line change
@@ -64,6 +64,13 @@ static GUID _ebpf_native_npi_id = {/* c847aac8-a6f2-4b53-aea3-f4a94b9a80cb */
0xa6f2,
0x4b53,
{0xae, 0xa3, 0xf4, 0xa9, 0x4b, 0x9a, 0x80, 0xcb}};

static GUID _ebpf_native_provider_id = {/* 5e24d2f5-f799-42c3-a945-87feefd930a7 */
0x5e24d2f5,
0xf799,
0x42c3,
{0xa9, 0x45, 0x87, 0xfe, 0xef, 0xd9, 0x30, 0xa7}};

static ebpf_extension_provider_t* _ebpf_native_provider = NULL;

#define EBPF_CLIENT_TABLE_BUCKET_COUNT 64
@@ -404,7 +411,6 @@ ebpf_native_initiate()
{
EBPF_LOG_ENTRY();
ebpf_result_t return_value;
GUID provider_module_id;
bool hash_table_created = false;

ebpf_lock_create(&_ebpf_native_client_table_lock);
@@ -422,15 +428,10 @@ ebpf_native_initiate()
}
hash_table_created = true;

return_value = ebpf_guid_create(&provider_module_id);
if (return_value != EBPF_SUCCESS) {
goto Done;
}

return_value = ebpf_provider_load(
&_ebpf_native_provider,
&_ebpf_native_npi_id,
&provider_module_id,
&_ebpf_native_provider_id,
NULL,
NULL,
NULL,
17 changes: 4 additions & 13 deletions libs/thunk/mock/mock.cpp
Original file line number Diff line number Diff line change
@@ -14,6 +14,8 @@ std::function<decltype(DuplicateHandle)> duplicate_handle_handler;
std::function<decltype(DeviceIoControl)> device_io_control_handler;
std::function<decltype(_get_osfhandle)> get_osfhandle_handler;
std::function<decltype(_open_osfhandle)> open_osfhandle_handler;
std::function<decltype(_create_service)> create_service_handler;
std::function<decltype(_delete_service)> delete_service_handler;

namespace Platform {
bool
@@ -150,24 +152,13 @@ _update_registry_value(
uint32_t
_create_service(_In_z_ const wchar_t* service_name, _In_z_ const wchar_t* file_path, _Out_ SC_HANDLE* service_handle)
{
// TODO: (Issue# 852) Just a stub currently in order to compile.
// Will be replaced by a proper mock.

UNREFERENCED_PARAMETER(service_name);
UNREFERENCED_PARAMETER(file_path);
*service_handle = (SC_HANDLE)1;

return ERROR_SUCCESS;
return create_service_handler(service_name, file_path, service_handle);
}

uint32_t
_delete_service(SC_HANDLE service_handle)
{
// TODO: (Issue# 852) Just a stub currently in order to compile.
// Will be replaced by a proper mock.

UNREFERENCED_PARAMETER(service_handle);
return ERROR_SUCCESS;
return delete_service_handler(service_handle);
}

uint32_t
8 changes: 8 additions & 0 deletions libs/thunk/mock/mock.h
Original file line number Diff line number Diff line change
@@ -6,6 +6,12 @@
#include <functional>
#include <io.h>

uint32_t
_create_service(_In_z_ const wchar_t* service_name, _In_z_ const wchar_t* file_path, _Out_ SC_HANDLE* service_handle);

uint32_t
_delete_service(SC_HANDLE service_handle);

extern std::function<decltype(_close)> close_handler;
extern std::function<decltype(CancelIoEx)> cancel_io_ex_handler;
extern std::function<decltype(CloseHandle)> close_handle_handler;
@@ -14,3 +20,5 @@ extern std::function<decltype(DuplicateHandle)> duplicate_handle_handler;
extern std::function<decltype(DeviceIoControl)> device_io_control_handler;
extern std::function<decltype(_get_osfhandle)> get_osfhandle_handler;
extern std::function<decltype(_open_osfhandle)> open_osfhandle_handler;
extern std::function<decltype(_create_service)> create_service_handler;
extern std::function<decltype(_delete_service)> delete_service_handler;
Loading

0 comments on commit 54516ec

Please sign in to comment.