在 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 可能包含有用的信息。
#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 可能包含有用的信息。