首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

AddDevice异常,导致系统重起

2012-02-17 
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

热点排行