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

时间:2015-01-05 14:48:28

标签: windows connection driver

       #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);
}

这是应用代码。 当我执行app时,Windbg打印&#34; IOCTL_TEST SJ~&#34;很好。但是在打印之后,系统中断错误和断点会挂在app main()函数的最后一行。我用visual studio 2013开发它。 我是否会错过一些异常流程?为什么应用程序出现故障并且系统崩溃?

1 个答案:

答案 0 :(得分:0)

STOP错误0x3B为SYSTEM_SERVICE_EXCEPTION

  

SYSTEM_SERVICE_EXCEPTION错误检查的值为0x0000003B。这表示在执行从非特权代码转换为特权代码的例程时发生异常。

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

有问题的例外是0xC0000005,STATUS_ACCESS_VIOLATION

  

访问冲突是尝试在当前页面保护设置下不允许的页面上执行操作。

句柄关闭时发生错误,原因是您显式关闭它或者因为进程退出。把所有这些放在一起,你可能会破坏一些关键的Windows对象,可能是设备对象或IRP。

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