#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开发它。 我是否会错过一些异常流程?为什么应用程序出现故障并且系统崩溃?
答案 0 :(得分:0)
STOP错误0x3B为SYSTEM_SERVICE_EXCEPTION:
SYSTEM_SERVICE_EXCEPTION错误检查的值为0x0000003B。这表示在执行从非特权代码转换为特权代码的例程时发生异常。
这表明异常并非发生在您的驱动程序自己的代码中(因为这是内核模式),而是在Windows执行程序中。
有问题的例外是0xC0000005,STATUS_ACCESS_VIOLATION:
访问冲突是尝试在当前页面保护设置下不允许的页面上执行操作。
句柄关闭时发生错误,原因是您显式关闭它或者因为进程退出。把所有这些放在一起,你可能会破坏一些关键的Windows对象,可能是设备对象或IRP。
通过使用Windbg分析崩溃转储,您可能能够获得更多线索,特别是exception context record可能包含有用的信息。