landwolf
驱动牛犊
驱动牛犊
  • 注册日期2002-11-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1245回复:4

这段代码有什么问题呀?为什么不能卸载?给20分

楼主#
更多 发布于:2004-06-10 22:11
下面这段代码,用beyondlogic的Install可以安装,但是卸载失败,为什么呀,高手指点呀

#pragma code_seg("INIT")

NTSTATUS
FileDiskCreateDevice (
    IN PDRIVER_OBJECT   DriverObject,
    IN ULONG            Number,
    IN DEVICE_TYPE      DeviceType
    )
{
NTSTATUS status;
UNICODE_STRING device_name;
PVIRUAL_DEVICE_EXTENT device_extension;
PDEVICE_OBJECT device_object;
RtlInitUnicodeString(&device_name, L"\Device\TestDisk1");
status = IoCreateDevice(
        DriverObject,
        sizeof(VIRUAL_DEVICE_EXTENT),
        &device_name,
        DeviceType,
        0,
        FALSE,
        &device_object
        );
if (!NT_SUCCESS(status))
    {
        return status;
    }

//初始化扩展结构中的内容
device_object->Flags |= DO_DIRECT_IO;
device_object->Flags &= ~DO_DEVICE_INITIALIZING;
device_extension = (PVIRUAL_DEVICE_EXTENT) device_object->DeviceExtension;
device_extension->type = DEVICE_TYPE_VIRUALDISK;
device_extension->media_in_device = FALSE;
device_extension->fdo = device_object;

return STATUS_SUCCESS;
}
extern "C"
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
UNICODE_STRING device_dir_name; //设备目录名称
NTSTATUS status; //返回状态
OBJECT_ATTRIBUTES       object_attributes; //对象属性
USHORT n_created_devices; //创建设备计数
status = STATUS_SUCCESS;
           FileDiskCreateDevice(DriverObject, 0, FILE_DEVICE_DISK);

DriverObject->DriverUnload = VirualWDM_Unload;
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLOSE] = VirualWDM_CreateClose;
DriverObject->MajorFunction[IRP_MJ_READ] =
DriverObject->MajorFunction[IRP_MJ_WRITE] = VirualWDM_ReadWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VirualWDM_DeviceControl;

return STATUS_SUCCESS;

}
#pragma code_seg()


//卸载驱动
#pragma code_seg("PAGE")
NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info);
NTSTATUS VirualWDM_CreateClose( IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
return CompleteIrp(Irp,STATUS_SUCCESS,FILE_OPENED);
}

PDEVICE_OBJECT
FileDiskDeleteDevice (
    IN PDEVICE_OBJECT DeviceObject
    )
{
    PVIRUAL_DEVICE_EXTENT   device_extension;
    PDEVICE_OBJECT      next_device_object;

  
    next_device_object = DeviceObject->NextDevice;

    IoDeleteDevice(DeviceObject);

    return next_device_object;
}

VOID VirualWDM_Unload(IN PDRIVER_OBJECT DriverObject)
{
PDEVICE_OBJECT device_object;
device_object = DriverObject->DeviceObject;
FileDiskDeleteDevice(device_object);
}
#pragma code_seg()

NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info);

NTSTATUS VirualWDM_ReadWrite(IN PDEVICE_OBJECT fdo,
 IN PIRP Irp)
{
return CompleteIrp(Irp,STATUS_NO_MEDIA_IN_DEVICE,0);
}


NTSTATUS VirualWDM_DeviceControl( IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
return CompleteIrp(Irp,STATUS_NO_MEDIA_IN_DEVICE,0);
}

NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info)
{
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = info;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return status;
}


[编辑 -  6/10/04 by  landwolf]
landwolf
驱动牛犊
驱动牛犊
  • 注册日期2002-11-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-12 00:34
我知道问题出在哪儿了,是因为我的source文件中指定了
DRIVERTYPE=WDM;
如果我把这行删除,就可以正常卸载了。

但是这引来了另外的问题:
这个标志表示我的驱动是WDM类型的,那么如果不设这个标志,默认应该是什么类型的?
WDM是不是不能利用CreateService系列函数安装和启动,停止?必须用inf文件?
在DriverEntry中直接创建驱动设备是否WDM类型的驱动?WDM是否有严格的定义必须在AddDevice中创建设备?

希望各位高手能够指点迷津,先谢谢了
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-12 19:44
NT式驱动在DriverEntry中直接调用IoCreateDevice来创建设备。
WDM的驱动需要在AddDevice中创建,当然如果你有多个DO(比如Filter),你可能不一定都严格按照这个规律。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
landwolf
驱动牛犊
驱动牛犊
  • 注册日期2002-11-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-13 10:37
WDM是不是不能利用CreateService系列函数安装和启动,停止?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-13 17:30
WDM通常使用专用安装函数
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部