AddDevice异常,导致系统重起
AddDevice错误,导致系统重起
步之什么原因,我照着书本上抄的代码,一安装驱动系统就重起。跟别的教材比对也没发现有哪些地方写的不对,真是郁闷。
小弟分不多,望高手指点!!
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT NextStackDevice;
PDEVICE_OBJECT pdo;
PDEVICE_OBJECT fdo;
UNICODE_STRING ifname;
UNICODE_STRING ifSymLinkName;
WMILIB_CONTEXT WmiLibInfo;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// AddDevice
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{
DbgPrint( "AddDevice Called.\n ");
NTSTATUS status;
PDEVICE_OBJECT fdo;
status = IoCreateDevice(DriverObject,
sizeof(DEVICE_EXTENSION),
NULL,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&fdo);
if(NT_ERROR(status))
return status;
// 将fdo记录在设备扩展中
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo-> DeviceExtension;
pdx-> pdo = pdo;
pdx-> fdo = fdo;
DbgPrint( "FDO is %x ", fdo);
// 可能有问题代码 begin
// 注册设备
status = IoRegisterDeviceInterface(pdo, &GUID_WDM, NULL,
&pdx-> ifSymLinkName);
if(NT_ERROR(status))
{
IoDeleteDevice(fdo);
return status;
}
// 使前面注册的设备接口类有效或无效
IoSetDeviceInterfaceState(&pdx-> ifSymLinkName, TRUE);
DbgPrint( "Symbolic Link Name is %T ", &pdx-> ifSymLinkName);
// 把设备对象放到设备堆栈上
pdx-> NextStackDevice = IoAttachDeviceToDeviceStack(fdo, pdo);
// 可能有问题代码 end
if(!pdx-> NextStackDevice)
{
IoDeleteDevice(fdo);
return STATUS_DEVICE_REMOVED;
}
// 设置设备标志
fdo-> Flags &= ~DO_DEVICE_INITIALIZING;
fdo-> Flags |= DO_BUFFERED_IO;
return STATUS_SUCCESS;
}
------解决方案--------------------
if(NT_ERROR(status))
这些有问题,不要用NT_ERROR,要用NT_SUCCESS
步之什么原因,我照着书本上抄的代码,一安装驱动系统就重起。跟别的教材比对也没发现有哪些地方写的不对,真是郁闷。
小弟分不多,望高手指点!!
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT NextStackDevice;
PDEVICE_OBJECT pdo;
PDEVICE_OBJECT fdo;
UNICODE_STRING ifname;
UNICODE_STRING ifSymLinkName;
WMILIB_CONTEXT WmiLibInfo;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// AddDevice
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{
DbgPrint( "AddDevice Called.\n ");
NTSTATUS status;
PDEVICE_OBJECT fdo;
status = IoCreateDevice(DriverObject,
sizeof(DEVICE_EXTENSION),
NULL,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&fdo);
if(NT_ERROR(status))
return status;
// 将fdo记录在设备扩展中
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo-> DeviceExtension;
pdx-> pdo = pdo;
pdx-> fdo = fdo;
DbgPrint( "FDO is %x ", fdo);
// 可能有问题代码 begin
// 注册设备
status = IoRegisterDeviceInterface(pdo, &GUID_WDM, NULL,
&pdx-> ifSymLinkName);
if(NT_ERROR(status))
{
IoDeleteDevice(fdo);
return status;
}
// 使前面注册的设备接口类有效或无效
IoSetDeviceInterfaceState(&pdx-> ifSymLinkName, TRUE);
DbgPrint( "Symbolic Link Name is %T ", &pdx-> ifSymLinkName);
// 把设备对象放到设备堆栈上
pdx-> NextStackDevice = IoAttachDeviceToDeviceStack(fdo, pdo);
// 可能有问题代码 end
if(!pdx-> NextStackDevice)
{
IoDeleteDevice(fdo);
return STATUS_DEVICE_REMOVED;
}
// 设置设备标志
fdo-> Flags &= ~DO_DEVICE_INITIALIZING;
fdo-> Flags |= DO_BUFFERED_IO;
return STATUS_SUCCESS;
}
------解决方案--------------------
if(NT_ERROR(status))
这些有问题,不要用NT_ERROR,要用NT_SUCCESS