|
@@ -33,6 +33,7 @@ static WDFDRIVER g_wdf_driver = nullptr;
|
|
|
|
|
|
|
|
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver_object,
|
|
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver_object,
|
|
|
PUNICODE_STRING registry_path) {
|
|
PUNICODE_STRING registry_path) {
|
|
|
|
|
+ DbgPrint("[CommModifyKit] DriverEntry ENTERED\n");
|
|
|
NTSTATUS status;
|
|
NTSTATUS status;
|
|
|
WDF_DRIVER_CONFIG cfg;
|
|
WDF_DRIVER_CONFIG cfg;
|
|
|
|
|
|
|
@@ -54,83 +55,68 @@ extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver_object,
|
|
|
// 初始化 ClientConnection(创建控制设备)
|
|
// 初始化 ClientConnection(创建控制设备)
|
|
|
status = commkit_driver::CreateControlDevice(commkit_driver::g_wdf_driver);
|
|
status = commkit_driver::CreateControlDevice(commkit_driver::g_wdf_driver);
|
|
|
if (!NT_SUCCESS(status)) {
|
|
if (!NT_SUCCESS(status)) {
|
|
|
|
|
+ DbgPrint("[CommModifyKit] CreateControlDevice FAILED 0x%08X\n", status);
|
|
|
return status;
|
|
return status;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ DbgPrint("[CommModifyKit] DriverEntry OK, EvtDeviceAdd registered\n");
|
|
|
return STATUS_SUCCESS;
|
|
return STATUS_SUCCESS;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
extern "C" NTSTATUS EvtDeviceAdd(WDFDRIVER driver, PWDFDEVICE_INIT init) {
|
|
extern "C" NTSTATUS EvtDeviceAdd(WDFDRIVER driver, PWDFDEVICE_INIT init) {
|
|
|
UNREFERENCED_PARAMETER(driver);
|
|
UNREFERENCED_PARAMETER(driver);
|
|
|
|
|
|
|
|
|
|
+ InterlockedIncrement(&g_diag_evt_device_add_count);
|
|
|
|
|
+
|
|
|
NTSTATUS status;
|
|
NTSTATUS status;
|
|
|
|
|
|
|
|
// 1. 标记为过滤设备
|
|
// 1. 标记为过滤设备
|
|
|
WdfFdoInitSetFilter(init);
|
|
WdfFdoInitSetFilter(init);
|
|
|
|
|
|
|
|
- // 2. 注册 PnP 电源回调(EvtDevicePrepareHardware 解析 COM 编号)
|
|
|
|
|
|
|
+ // 2. 注册 PnP 电源回调
|
|
|
WDF_PNPPOWER_EVENT_CALLBACKS pnp_callbacks;
|
|
WDF_PNPPOWER_EVENT_CALLBACKS pnp_callbacks;
|
|
|
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnp_callbacks);
|
|
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnp_callbacks);
|
|
|
pnp_callbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware;
|
|
pnp_callbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware;
|
|
|
WdfDeviceInitSetPnpPowerEventCallbacks(init, &pnp_callbacks);
|
|
WdfDeviceInitSetPnpPowerEventCallbacks(init, &pnp_callbacks);
|
|
|
|
|
|
|
|
- // 3. 注册 WDM IRP 预处理回调(拦截 READ/WRITE/DEVICE_CONTROL)
|
|
|
|
|
|
|
+ // 3. 注册 WDM IRP 预处理回调
|
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
|
init, commkit_driver::SerialFilter::DispatchRead,
|
|
init, commkit_driver::SerialFilter::DispatchRead,
|
|
|
IRP_MJ_READ, nullptr, 0);
|
|
IRP_MJ_READ, nullptr, 0);
|
|
|
- if (!NT_SUCCESS(status)) {
|
|
|
|
|
- return status;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!NT_SUCCESS(status)) { InterlockedExchange(&g_diag_last_failure_status, status); return status; }
|
|
|
|
|
|
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
|
init, commkit_driver::SerialFilter::DispatchWrite,
|
|
init, commkit_driver::SerialFilter::DispatchWrite,
|
|
|
IRP_MJ_WRITE, nullptr, 0);
|
|
IRP_MJ_WRITE, nullptr, 0);
|
|
|
- if (!NT_SUCCESS(status)) {
|
|
|
|
|
- return status;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!NT_SUCCESS(status)) { InterlockedExchange(&g_diag_last_failure_status, status); return status; }
|
|
|
|
|
|
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
|
init, commkit_driver::SerialFilter::DispatchDeviceControl,
|
|
init, commkit_driver::SerialFilter::DispatchDeviceControl,
|
|
|
IRP_MJ_DEVICE_CONTROL, nullptr, 0);
|
|
IRP_MJ_DEVICE_CONTROL, nullptr, 0);
|
|
|
- if (!NT_SUCCESS(status)) {
|
|
|
|
|
- return status;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!NT_SUCCESS(status)) { InterlockedExchange(&g_diag_last_failure_status, status); return status; }
|
|
|
|
|
|
|
|
- // 注册 CREATE/CLOSE/CLEANUP 预处理回调(确保正确转发)
|
|
|
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
|
init, commkit_driver::SerialFilter::DispatchCreate,
|
|
init, commkit_driver::SerialFilter::DispatchCreate,
|
|
|
IRP_MJ_CREATE, nullptr, 0);
|
|
IRP_MJ_CREATE, nullptr, 0);
|
|
|
- if (!NT_SUCCESS(status)) {
|
|
|
|
|
- return status;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!NT_SUCCESS(status)) { InterlockedExchange(&g_diag_last_failure_status, status); return status; }
|
|
|
|
|
|
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
|
init, commkit_driver::SerialFilter::DispatchClose,
|
|
init, commkit_driver::SerialFilter::DispatchClose,
|
|
|
IRP_MJ_CLOSE, nullptr, 0);
|
|
IRP_MJ_CLOSE, nullptr, 0);
|
|
|
- if (!NT_SUCCESS(status)) {
|
|
|
|
|
- return status;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!NT_SUCCESS(status)) { InterlockedExchange(&g_diag_last_failure_status, status); return status; }
|
|
|
|
|
|
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
status = WdfDeviceInitAssignWdmIrpPreprocessCallback(
|
|
|
init, commkit_driver::SerialFilter::DispatchCleanup,
|
|
init, commkit_driver::SerialFilter::DispatchCleanup,
|
|
|
IRP_MJ_CLEANUP, nullptr, 0);
|
|
IRP_MJ_CLEANUP, nullptr, 0);
|
|
|
- if (!NT_SUCCESS(status)) {
|
|
|
|
|
- return status;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!NT_SUCCESS(status)) { InterlockedExchange(&g_diag_last_failure_status, status); return status; }
|
|
|
|
|
|
|
|
- // 4. 设置宽松 SDDL(匹配 serial.sys 行为)
|
|
|
|
|
- // WDF 默认 SDDL 仅 System+Administrators,会导致非 elevated 进程
|
|
|
|
|
- // 无法打开 \\.\COMx(即使 Administrator 账户在 filtered token 下也失败)
|
|
|
|
|
- // AU=Authenticated Users, WD=Everyone 给读写权限
|
|
|
|
|
- static DECLARE_CONST_UNICODE_STRING(
|
|
|
|
|
- sddl_filter,
|
|
|
|
|
- L"D:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;GRGW;;;AU)(A;;GRGW;;;WD)");
|
|
|
|
|
- status = WdfDeviceInitAssignSDDLString(init, &sddl_filter);
|
|
|
|
|
- if (!NT_SUCCESS(status)) {
|
|
|
|
|
- DbgPrint("[CommModifyKit] WdfDeviceInitAssignSDDLString failed 0x%08X\n", status);
|
|
|
|
|
- return status;
|
|
|
|
|
- }
|
|
|
|
|
- DbgPrint("[CommModifyKit] SDDL assigned OK\n");
|
|
|
|
|
|
|
+ InterlockedIncrement(&g_diag_irp_preprocess_ok);
|
|
|
|
|
+
|
|
|
|
|
+ // 4. SDDL: WDF filter device 不支持 WdfDeviceInitAssignSDDLString
|
|
|
|
|
+ // 它会返回 STATUS_INVALID_SECURITY_DESCR (0xC0000079)
|
|
|
|
|
+ // Filter device 会继承下层设备 (serial.sys) 的安全描述符
|
|
|
|
|
+ // 不需要显式设置 SDDL
|
|
|
|
|
+ InterlockedIncrement(&g_diag_sddl_ok);
|
|
|
|
|
|
|
|
// 5. 创建 WDF 设备
|
|
// 5. 创建 WDF 设备
|
|
|
WDFDEVICE device;
|
|
WDFDEVICE device;
|
|
@@ -139,21 +125,19 @@ extern "C" NTSTATUS EvtDeviceAdd(WDFDRIVER driver, PWDFDEVICE_INIT init) {
|
|
|
attrs.EvtCleanupCallback = EvtDeviceContextCleanup;
|
|
attrs.EvtCleanupCallback = EvtDeviceContextCleanup;
|
|
|
|
|
|
|
|
status = WdfDeviceCreate(&init, &attrs, &device);
|
|
status = WdfDeviceCreate(&init, &attrs, &device);
|
|
|
- if (!NT_SUCCESS(status)) {
|
|
|
|
|
- DbgPrint("[CommModifyKit] WdfDeviceCreate failed 0x%08X\n", status);
|
|
|
|
|
- return status;
|
|
|
|
|
- }
|
|
|
|
|
- DbgPrint("[CommModifyKit] WdfDeviceCreate OK\n");
|
|
|
|
|
|
|
+ if (!NT_SUCCESS(status)) { InterlockedExchange(&g_diag_last_failure_status, status); return status; }
|
|
|
|
|
+
|
|
|
|
|
+ InterlockedIncrement(&g_diag_device_create_ok);
|
|
|
|
|
|
|
|
- // 5. 初始化设备上下文
|
|
|
|
|
|
|
+ // 6. 初始化设备上下文
|
|
|
PDEVICE_CONTEXT ctx = DeviceGetContext(device);
|
|
PDEVICE_CONTEXT ctx = DeviceGetContext(device);
|
|
|
- ctx->ComNumber = 0; // 延迟到 EvtDevicePrepareHardware 解析
|
|
|
|
|
|
|
+ ctx->ComNumber = 0;
|
|
|
ctx->MonitoringEnabled = FALSE;
|
|
ctx->MonitoringEnabled = FALSE;
|
|
|
ctx->RingBuffer = nullptr;
|
|
ctx->RingBuffer = nullptr;
|
|
|
ctx->WdfDevice = device;
|
|
ctx->WdfDevice = device;
|
|
|
ctx->LowerDevice = WdfDeviceWdmGetAttachedDevice(device);
|
|
ctx->LowerDevice = WdfDeviceWdmGetAttachedDevice(device);
|
|
|
|
|
|
|
|
- // 6. 注册到全局端口表(com_number 暂为 0,PrepareHardware 时更新)
|
|
|
|
|
|
|
+ // 7. 注册到全局端口表
|
|
|
commkit_driver::GetClientConnection().RegisterFilterDevice(device);
|
|
commkit_driver::GetClientConnection().RegisterFilterDevice(device);
|
|
|
|
|
|
|
|
return STATUS_SUCCESS;
|
|
return STATUS_SUCCESS;
|
|
@@ -168,6 +152,8 @@ NTSTATUS EvtDevicePrepareHardware(WDFDEVICE device,
|
|
|
NTSTATUS status;
|
|
NTSTATUS status;
|
|
|
PDEVICE_CONTEXT ctx = DeviceGetContext(device);
|
|
PDEVICE_CONTEXT ctx = DeviceGetContext(device);
|
|
|
|
|
|
|
|
|
|
+ InterlockedIncrement(&g_diag_prepare_hardware_count);
|
|
|
|
|
+
|
|
|
// 从 PnP 属性解析 COM 编号
|
|
// 从 PnP 属性解析 COM 编号
|
|
|
// 方式:获取 DevicePropertyFriendlyName 或 DevicePropertyDeviceDescription,
|
|
// 方式:获取 DevicePropertyFriendlyName 或 DevicePropertyDeviceDescription,
|
|
|
// 匹配 "COM%d" 模式
|
|
// 匹配 "COM%d" 模式
|