Files
nt-lite/code/public/ntlite/ddk/module.h
T

91 lines
3.4 KiB
C

#pragma once
#include <stdint.h>
#include <ntlite/status.h>
#include <ntlite/ddk/device.h>
#define NTL_DDK_MODULE_EXPORT_NAME "NtlDriverModule"
#define NTL_DDK_MODULE_SIGNATURE 0x324D444Eu // "NDM2" in little-endian memory.
#define NTL_DDK_MODULE_ABI_VERSION 5u
typedef struct NTL_MODULE NTL_MODULE;
typedef KSTATUS (*NTL_MODULE_INITIALIZE)(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_INITIALIZE Initialize;
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_EXPORT;
#ifdef __cplusplus
static_assert(sizeof(NTL_MODULE_EXPORT) == 72u, "DDK module export ABI changed");
#define NTL_DDK_C_EXPORT extern "C"
#else
_Static_assert(sizeof(NTL_MODULE_EXPORT) == 72u, "DDK module export ABI changed");
#define NTL_DDK_C_EXPORT
#endif
#define NTL_DECLARE_MODULE(initialize_fn) \
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, (initialize_fn), 0, 0u, 0u, 0, 0u, 0u, 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 \
}
#define NTL_DECLARE_IO_MODULE(initialize_fn, 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, (initialize_fn), 0, 0u, 0u, \
(driverArray), (uint32_t)(sizeof(driverArray) / sizeof((driverArray)[0])), 0u, 0, 0 \
}
#define NTL_DECLARE_MODULE_WITH_SHUTDOWN(initialize_fn, prepareFn, 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, (initialize_fn), 0, 0u, 0u, \
0, 0u, 0u, (prepareFn), (commitFn) \
}
#define NTL_DECLARE_IO_MODULE_WITH_SHUTDOWN(initialize_fn, driverArray, prepareFn, 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, (initialize_fn), 0, 0u, 0u, \
(driverArray), (uint32_t)(sizeof(driverArray) / sizeof((driverArray)[0])), 0u, \
(prepareFn), (commitFn) \
}
// 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