91 lines
3.4 KiB
C
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
|