#pragma once #include #include #include #define NTL_DDK_MODULE_EXPORT_NAME "NtlDriverModule" #define NTL_DDK_MODULE_SIGNATURE 0x324D444Eu // "NDM2" in little-endian memory. #define NTL_DDK_MODULE_ABI_VERSION 6u typedef struct NTL_MODULE NTL_MODULE; typedef KSTATUS (*NTL_MODULE_PREPARE_START)(NTL_MODULE* module); typedef void (*NTL_MODULE_COMMIT_START)(NTL_MODULE* module); typedef void (*NTL_MODULE_ABORT_START)(NTL_MODULE* module); typedef KSTATUS (*NTL_MODULE_PREPARE_SHUTDOWN)(NTL_MODULE* module); typedef void (*NTL_MODULE_COMMIT_SHUTDOWN)(NTL_MODULE* module); struct DRIVER_OBJECT; typedef struct NTL_MODULE_EXPORT { uint32_t Signature; uint32_t Version; uint32_t Size; uint32_t Flags; NTL_MODULE_PREPARE_START PrepareStart; const NTL_DEVICE_DESC* Devices; uint32_t DeviceCount; uint32_t Reserved; struct DRIVER_OBJECT* const* IoDrivers; uint32_t IoDriverCount; uint32_t Reserved2; NTL_MODULE_PREPARE_SHUTDOWN PrepareShutdown; NTL_MODULE_COMMIT_SHUTDOWN CommitShutdown; NTL_MODULE_COMMIT_START CommitStart; NTL_MODULE_ABORT_START AbortStart; } NTL_MODULE_EXPORT; #ifdef __cplusplus static_assert(sizeof(NTL_MODULE_EXPORT) == 88u, "DDK module export ABI changed"); #define NTL_DDK_C_EXPORT extern "C" #else _Static_assert(sizeof(NTL_MODULE_EXPORT) == 88u, "DDK module export ABI changed"); #define NTL_DDK_C_EXPORT #endif #define NTL_DECLARE_MODULE(prepareFn) \ NTL_DDK_C_EXPORT __declspec(dllexport) const NTL_MODULE_EXPORT NtlDriverModule = { \ NTL_DDK_MODULE_SIGNATURE, NTL_DDK_MODULE_ABI_VERSION, \ (uint32_t)sizeof(NTL_MODULE_EXPORT), 0u, (prepareFn), 0, 0u, 0u, 0, 0u, 0u, 0, 0, 0, 0 \ } #define NTL_DECLARE_DEVICE_MODULE(deviceArray) \ NTL_DDK_C_EXPORT __declspec(dllexport) const NTL_MODULE_EXPORT NtlDriverModule = { \ NTL_DDK_MODULE_SIGNATURE, NTL_DDK_MODULE_ABI_VERSION, \ (uint32_t)sizeof(NTL_MODULE_EXPORT), 0u, 0, (deviceArray), \ (uint32_t)(sizeof(deviceArray) / sizeof((deviceArray)[0])), 0u, 0, 0u, 0u, 0, 0, 0, 0 \ } #define NTL_DECLARE_IO_MODULE(prepareFn, driverArray) \ NTL_DDK_C_EXPORT __declspec(dllexport) const NTL_MODULE_EXPORT NtlDriverModule = { \ NTL_DDK_MODULE_SIGNATURE, NTL_DDK_MODULE_ABI_VERSION, \ (uint32_t)sizeof(NTL_MODULE_EXPORT), 0u, (prepareFn), 0, 0u, 0u, \ (driverArray), (uint32_t)(sizeof(driverArray) / sizeof((driverArray)[0])), 0u, 0, 0, 0, 0 \ } #define NTL_DECLARE_MODULE_WITH_SHUTDOWN(startPrepareFn, shutdownPrepareFn, commitFn) \ NTL_DDK_C_EXPORT __declspec(dllexport) const NTL_MODULE_EXPORT NtlDriverModule = { \ NTL_DDK_MODULE_SIGNATURE, NTL_DDK_MODULE_ABI_VERSION, \ (uint32_t)sizeof(NTL_MODULE_EXPORT), 0u, (startPrepareFn), 0, 0u, 0u, \ 0, 0u, 0u, (shutdownPrepareFn), (commitFn), 0, 0 \ } #define NTL_DECLARE_IO_MODULE_WITH_SHUTDOWN(startPrepareFn, driverArray, shutdownPrepareFn, commitFn) \ NTL_DDK_C_EXPORT __declspec(dllexport) const NTL_MODULE_EXPORT NtlDriverModule = { \ NTL_DDK_MODULE_SIGNATURE, NTL_DDK_MODULE_ABI_VERSION, \ (uint32_t)sizeof(NTL_MODULE_EXPORT), 0u, (startPrepareFn), 0, 0u, 0u, \ (driverArray), (uint32_t)(sizeof(driverArray) / sizeof((driverArray)[0])), 0u, \ (shutdownPrepareFn), (commitFn), 0, 0 \ } // Prepare may fail. Commit publishes fully prepared state and returns void. #define NTL_DECLARE_STAGED_MODULE(prepareFn, commitFn, abortFn) \ NTL_DDK_C_EXPORT __declspec(dllexport) const NTL_MODULE_EXPORT NtlDriverModule = { \ NTL_DDK_MODULE_SIGNATURE, NTL_DDK_MODULE_ABI_VERSION, \ (uint32_t)sizeof(NTL_MODULE_EXPORT), 0u, (prepareFn), 0, 0u, 0u, \ 0, 0u, 0u, 0, 0, (commitFn), (abortFn) \ } #define NTL_DECLARE_STAGED_IO_MODULE(prepareFn, driverArray, commitFn, abortFn) \ NTL_DDK_C_EXPORT __declspec(dllexport) const NTL_MODULE_EXPORT NtlDriverModule = { \ NTL_DDK_MODULE_SIGNATURE, NTL_DDK_MODULE_ABI_VERSION, \ (uint32_t)sizeof(NTL_MODULE_EXPORT), 0u, (prepareFn), 0, 0u, 0u, \ (driverArray), (uint32_t)(sizeof(driverArray) / sizeof((driverArray)[0])), \ 0u, 0, 0, (commitFn), (abortFn) \ } // Query the configured module identity; the returned string is borrowed. #ifdef NTL_KERNEL_BUILD #define NTL_DDK_MODULE_API __declspec(dllexport) #else #define NTL_DDK_MODULE_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif NTL_DDK_MODULE_API const char* NtlModuleGetName(const NTL_MODULE* module); #ifdef __cplusplus } #endif