zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
阅读:1181回复:7

tooflat来,帮我

楼主#
更多 发布于:2005-03-28 17:53
我做了一个简单的LOCK USB的过滤驱动.我没有使用在REG中写入UpperFilters 方式.而是在程序中利用IoGetDeviceObjectPointer得到设备对象,然后创建个设备IoAttachDeviceToDeviceStack到原来的设备上.

驱动加载以后,USB确实不能使用,但是我卸载以后,USB同样不能使用,必须重新完成插拔动作后,方可使用.这个错误我可以容忍,但是,经过上述过程后,WINDOWS在关机或重新启动的时候会出现蓝屏.提示有没有处理完的IRP.可是我在UNLOAD的时候已经都DETEACH了.

希望得到大家的帮助,这是我写的第一个驱动,我需要他为以后建立信心.

谢谢


[编辑 -  3/28/05 by  zhjie374]
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-29 14:09
经过我修改以后,我现在可以在驱动卸载以后恢复USB的读写操作.
但是不能从WINDOWS卸载U盘,说U盘仍然在使用.但是我在UNLOAD里面已经做了相应的操作.

如果有人愿意帮助我的,留下EMAIL.我发给你.

谢谢
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-29 19:18
把代码贴出来吧
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-30 09:45
请指教:

// LockA.c
// 03-21-2005 <Jason Zhang>
// Copyright &#65385; 2005 <SCT SH>
//UpperFilter USBPDO-3

#define  _LOCKA_SYS_
#include <ddk\\ntddk.h>
#include \"LockA.h\"
#define NAME L\"\\\\Device\\\\USBPDO-3\"
// =================================================================
// REVISION HISTORY
// =================================================================

/*

03-21-2005 V1.00 Original version.

*/

// =================================================================
// GLOBAL DATA
// =================================================================
//In order to save original function address
PDRIVER_DISPATCH g_p_real_dispatch_device_control = NULL;
PDRIVER_OBJECT g_p_target_driver_object = NULL;
PDEVICE_OBJECT g_p_fdo=NULL;
PDEVICE_OBJECT g_p_fido=NULL;
BOOLEAN fSymbolicLink;



//----------------------------------------------------------------
//Test by Jason
PDRIVER_DISPATCH g_p_read=NULL;
PDRIVER_DISPATCH g_p_close=NULL;
PDRIVER_DISPATCH g_p_pnp=NULL;
PDRIVER_DISPATCH g_p_dev=NULL;
PDRIVER_DISPATCH g_p_in_dev=NULL;
PDRIVER_DISPATCH g_p_create=NULL;
PDRIVER_DISPATCH g_p_cleanup=NULL;
PDRIVER_DISPATCH g_p_setinfo=NULL;
// =================================================================
// DISCARDABLE FUNCTIONS
// =================================================================

NTSTATUS DriverEntry      (PDRIVER_OBJECT  pDriverObject,
                           PUNICODE_STRING pusRegistryPath);

NTSTATUS MyControl        (PDEVICE_OBJECT Device_Object,PIRP irp);

NTSTATUS MySendToNextDriver(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
// -----------------------------------------------------------------

#ifdef ALLOC_PRAGMA

#pragma alloc_text (INIT, DriverEntry)

#endif

//==================================================================
//MyControl
//==================================================================
NTSTATUS MyControl(PDEVICE_OBJECT Device_Object,PIRP irp)
{

PAGED_CODE ();
irp->IoStatus.Status = STATUS_ACCESS_DENIED;
irp->IoStatus.Information = 0;
IoCompleteRequest(irp, IO_NO_INCREMENT);

//UNICODE_STRING file;

return STATUS_ACCESS_DENIED;

}

//------------------------------------------------------------------
void DriverUnload (PDRIVER_OBJECT pDriverObject)
{
PAGED_CODE ();
DbgPrint(\"Here is DriverUnload\");
g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL]=g_p_real_dispatch_device_control;
g_p_target_driver_object->MajorFunction[IRP_MJ_READ] =g_p_read;
g_p_target_driver_object->MajorFunction[IRP_MJ_CREATE]=g_p_create;
g_p_target_driver_object->MajorFunction[IRP_MJ_PNP]=g_p_pnp;
g_p_target_driver_object->MajorFunction[IRP_MJ_CLOSE]=g_p_close;
g_p_target_driver_object->MajorFunction[IRP_MJ_CLEANUP]=g_p_cleanup;
g_p_target_driver_object->MajorFunction[IRP_MJ_SET_INFORMATION]=g_p_setinfo;
g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL]=g_p_dev;
g_p_target_driver_object->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]=g_p_in_dev;
ObDereferenceObject(g_p_target_driver_object->DeviceObject);
IoDetachDevice(g_p_fdo);
if(g_p_fido!=NULL)
{
IoDeleteDevice(g_p_fido);
}
// IoDeleteDevice(pDriverObject->DeviceObject);

return;
}
//---------------------------------------------------------------------------
NTSTATUS MySendToNextDriver(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
PDEVICE_EXTENSION deviceExtension;
    PAGED_CODE ();
DbgPrint(\"Here is MySendToNextDriver\");
IoSkipCurrentIrpStackLocation(Irp);
deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;

return IoCallDriver(g_p_fdo, Irp);
}

//---------------------------------------------------------------------
NTSTATUS MyDispatchPower(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
PDEVICE_EXTENSION   deviceExtension;
    
    PAGED_CODE ();
DbgPrint(\"Power Here\");
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    PoStartNextPowerIrp(Irp);
    IoSkipCurrentIrpStackLocation(Irp);
    return PoCallDriver(deviceExtension->NextStackDevice, Irp);
}
//----------------------------------------------------------------------
NTSTATUS MyRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
PAGED_CODE();
DbgPrint(\"Read Here\");
return MyControl(DeviceObject,Irp);
}

//----------------------------------------------------------------------
NTSTATUS MyWrite(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
PAGED_CODE();
DbgPrint(\"Write Here\");
return MyControl(DeviceObject,Irp);
}
//----------------------------------------------------------------------
NTSTATUS MyCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
PAGED_CODE();
DbgPrint(\"Create Here\");
return MyControl(DeviceObject,Irp);
}
//----------------------------------------------------------------------
NTSTATUS MyDevCtl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
PAGED_CODE();
DbgPrint(\"DevCtl Here\");
return MyControl(DeviceObject,Irp);
}
//----------------------------------------------------------------------
NTSTATUS MyInDevCtl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
PAGED_CODE();
DbgPrint(\"InDevCtl Here\");
return MyControl(DeviceObject,Irp);
}
// =================================================================
// DRIVER Entry

// -----------------------------------------------------------------

NTSTATUS DriverEntry (PDRIVER_OBJECT  pDriverObject,
                      PUNICODE_STRING pusRegistryPath)
    {
PDRIVER_DISPATCH *ppdd;
UNICODE_STRING target_device_name;
PDEVICE_OBJECT target_device_object;
PFILE_OBJECT target_file_object;
PDEVICE_OBJECT fido;
PDEVICE_EXTENSION pdx;
PDEVICE_OBJECT fdo;
ULONG i;
NTSTATUS status;

UNICODE_STRING ntDeviceName;
UNICODE_STRING win32DeviceName;
//Initialize unicode string by
RtlInitUnicodeString(&target_device_name, NAME);
status = IoGetDeviceObjectPointer(
&target_device_name,
0,
&target_file_object,
&target_device_object
);

if (!NT_SUCCESS(status))
{
KdPrint((\"IoGetDeviceObjectPointer return %Xn\", status));
return status;
}

//why still need IoCreateDevice after calling IoGetDeviceObjectPointer

status=IoCreateDevice(pDriverObject,
sizeof(DEVICE_EXTENSION),
&ntDeviceName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&fido);
if (!NT_SUCCESS(status))
{//Unsuccess
KdPrint((\"IoCreateDevice return %Xn\", status));
return status;
}
else{
//Success
//All following are boring me!
g_p_fido=fido;
pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;
pdx->fdo = fido;
DbgPrint(\"Before Attach\");
fdo = IoAttachDeviceToDeviceStack(fido,target_device_object);
g_p_fdo=fdo;
DbgPrint(\"After Attach\");
DbgPrint(\"NextDevice %X\",g_p_fdo);
pdx->NextStackDevice = fdo;
fido->Flags |= fdo->Flags & (DO_DIRECT_IO|DO_BUFFERED_IO);//|=--or_eq
fido->Flags |= DO_POWER_PAGABLE;
fido->DeviceType = fdo->DeviceType;
fido->Characteristics = fdo->Characteristics;
fido->Flags &= ~DO_DEVICE_INITIALIZING;

}
g_p_target_driver_object = target_device_object->DriverObject;

if (!g_p_target_driver_object)
{
KdPrint((\"target_device_object->DriverObject == NULLn\"));
return STATUS_UNSUCCESSFUL;
}
KdPrint((\"target_device_object is %Xn\",target_device_object));

KdPrint((\"g_p_target_driver_object is %Xn\",g_p_target_driver_object));

g_p_real_dispatch_device_control = g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL];

g_p_read=g_p_target_driver_object->MajorFunction[IRP_MJ_READ];
g_p_create=g_p_target_driver_object->MajorFunction[IRP_MJ_CREATE];
g_p_pnp=g_p_target_driver_object->MajorFunction[IRP_MJ_PNP];
g_p_close=g_p_target_driver_object->MajorFunction[IRP_MJ_CLOSE];
g_p_cleanup=g_p_target_driver_object->MajorFunction[IRP_MJ_CLEANUP];
g_p_setinfo=g_p_target_driver_object->MajorFunction[IRP_MJ_SET_INFORMATION];
g_p_dev=g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL];
g_p_in_dev=g_p_target_driver_object->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL];

KdPrint((\"g_p_real_dispatch_device_control is %Xn\",g_p_real_dispatch_device_control));

ppdd = g_p_target_driver_object->MajorFunction;
//-----------------------------------------------------------------------

for(i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
ppdd = MySendToNextDriver;//
}
//-----------------------------------------------------------------------

    ppdd [IRP_MJ_CREATE                  ] =MyCreate;
    ppdd [IRP_MJ_READ                    ] =MyRead;
ppdd [IRP_MJ_WRITE                   ] =MyWrite;
    ppdd [IRP_MJ_DEVICE_CONTROL          ] =MyDevCtl;
    ppdd [IRP_MJ_INTERNAL_DEVICE_CONTROL ] =MyInDevCtl;
    ppdd [IRP_MJ_PNP                     ] =MyControl;
ppdd [IRP_MJ_POWER                   ] =MyDispatchPower;
    pDriverObject->DriverUnload            = DriverUnload;
    return status;
    }

// =================================================================
// END OF PROGRAM
// =================================================================
gongbin_net
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2005-06-07
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-30 12:08
发给我看看,我想可能是你其他还有些资源没有释放掉,说明你的pnp处理部队
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-30 12:54
楼上的留下你的EMAIL.

先谢了
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-30 15:11
不清楚蓝屏的原因是什么,
不过我有个问题搞不懂,为什么你attach到usb设备上了,为什么还要替换它的dispatch routine,这两个只要做一个就可以了,试试不attach如何
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-30 15:55
我现在觉得这个方法可能不行.因为U的驱动是U插上以后才上的.所以我现在不用这种方法了,我写注册表UPPERFILTERS,不知道能不能成功.

另外,我控制只读的话,应该禁止哪个IRP?
游客

返回顶部