在 Windows 驱动程序 - 应用程序连接中,应用程序 main() 因错误而中断

In Windows driver - app connection, app main() break with error

       #define IOCTL_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
...
     NTSTATUS MyIOControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){
            PIO_STACK_LOCATION pStack;
            NTSTATUS returnStatus = STATUS_SUCCESS;
            ULONG ControlCode;
            pStack = IoGetCurrentIrpStackLocation(Irp);
            ControlCode = pStack->Parameters.DeviceIoControl.IoControlCode;
            switch (ControlCode)
            {
            case IOCTL_TEST:
                DbgPrint("IOCTL_TEST SJ~");
                break;
            default:
                break;
            }
            Irp->IoStatus.Status = STATUS_SUCCESS;
            IoCompleteRequest(Irp, IO_NO_INCREMENT);
            return returnStatus;
        }

这是驱动代码。

#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#define IOCTL_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
void main(){
    HANDLE dHandle;
    WCHAR DeviceLink[] = L"\\.\sjdriver";
    DWORD dwRet;
    dHandle = CreateFileW(DeviceLink, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (dHandle == INVALID_HANDLE_VALUE){
        printf("Get Device handle Fail : 0x%X\n", GetLastError());
        _getch();
        return;
    }

    if (!DeviceIoControl(dHandle, IOCTL_TEST, 0, 0, 0, 0, &dwRet, 0)){
        printf("DeviceIOControl Fail \n");
        _getch();
        CloseHandle(dHandle);
        return;
    }
    CloseHandle(dHandle);
}

这是应用代码。 当我执行应用程序时,Windbg 会很好地打印 "IOCTL_TEST SJ~" 字符串。但打印后,系统因错误而中断,断点挂在 app main() 函数的最后一行。我用 visual studio 2013 开发了这个。 我是否错过了一些异常过程?为什么会出现应用程序中断和系统卡顿?

STOP 错误 0x3B 是 SYSTEM_SERVICE_EXCEPTION:

The SYSTEM_SERVICE_EXCEPTION bug check has a value of 0x0000003B. This indicates that an exception happened while executing a routine that transitions from non-privileged code to privileged code.

这表明异常不是发生在您的驱动程序自己的代码中(因为那是内核模式),而是发生在 Windows 执行程序中。

有问题的异常是0xC0000005,STATUS_ACCESS_VIOLATION:

An access violation is an attempt to perform an operation on a page that is not permitted under the current page protection settings.

关闭句柄时发生错误,这可能是因为您明确关闭它,也可能是因为进程退出。将所有这些放在一起,您似乎正在破坏一些关键的 Windows 对象,可能是设备对象或 IRP。

您可以通过使用 Windbg 分析故障转储获得更多线索,特别是 exception context record 可能包含有用的信息。