bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1284回复:5

请高手帮着找毛病

楼主#
更多 发布于:2004-11-18 15:48
我用CreateService()可建立服务,但startservice()总返回0,我在驱动程序中加了Debugprint想跟踪一下,哪想到了startservice()却黑屏重启了,请看看我的代码,找找毛病,帮帮忙啊

///////////////////filter.cpp//////////////////////////////
#include "filter.h"

#define NT_DEVICE_NAME L"\\Device\\SeaCdromFilter"
#define DOS_DEVICE_NAME L"\\DosDevices\\SeaCdromFilter"

extern "C"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
                     IN PUNICODE_STRING RegistryPath)
{

#if DBG
DebugPrintInit("SeaCdromFilter checked");
    #else
DebugPrintInit("SeaCdromFilter free");
    #endif

DebugPrint("RegistryPath is %T",RegistryPath);

fSymbolicLink = FALSE;

DriverObject->DriverUnload = DriverUnload;
DriverObject->DriverExtension->AddDevice = MyAddDevice;

ULONG i;

    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
        DriverObject->MajorFunction = MySendToNextDriver;
    }

DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyDrvDeviceControl;
    //DriverObject->MajorFunction[IRP_MJ_READ]= MyDrvDeviceControl;
    //DriverObject->MajorFunction[IRP_MJ_WRITE]= MyDrvDeviceControl;

DebugPrintMsg("DriverEntry completed");

    return STATUS_SUCCESS;
}

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
   UNICODE_STRING  win32DeviceName;

   RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME);

   if(fido)
{
IoDeleteDevice(fido);
}

    if(fSymbolicLink)
    {
   IoDeleteSymbolicLink(&win32DeviceName);
    }

}
NTSTATUS MyAddDevice(IN PDRIVER_OBJECT DriverObject,
                     IN PDEVICE_OBJECT pdo)
{
DebugPrint("AddDevice");

    NTSTATUS status;
    //PDEVICE_OBJECT fido;

UNICODE_STRING ntDeviceName;
    UNICODE_STRING win32DeviceName;

RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME);

    status = IoCreateDevice(DriverObject,              
                            sizeof(DEVICE_EXTENSION),    
                            &ntDeviceName,                  
                            FILE_DEVICE_CD_ROM,        
                            0,                          
                            FALSE,                    
                            &fido);                    

 
    if( !NT_SUCCESS(status))
{

}
    else
{
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;
        pdx->fdo = fido;

//新设备对象放到堆栈上,返给你下一层设备对象的地址
   PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo);
        pdx->NextStackDevice = fdo;

        //初始化设备标志
   fido->Flags |= DO_DIRECT_IO;
        fido->Flags |= DO_POWER_PAGABLE;
        fido->DeviceType = fdo->DeviceType;
        fido->Characteristics = fdo->Characteristics;

//清除DO_DEVICE_INITIALIZING 标志
        fido->Flags &= ~DO_DEVICE_INITIALIZING;

RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME);
        status = IoCreateSymbolicLink(&win32DeviceName, &ntDeviceName);
        if (!NT_SUCCESS(status))
{

}
else
{
   fSymbolicLink = TRUE;
}


}

    if (!NT_SUCCESS(status))
{
        if(fido)
{
IoDeleteDevice(fido);
}
if(fSymbolicLink)
{
IoDeleteSymbolicLink(&win32DeviceName);
}
}
  
    return status;

}

NTSTATUS MySendToNextDriver(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
PDEVICE_EXTENSION deviceExtension;

    IoSkipCurrentIrpStackLocation(Irp);
    deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;

    return IoCallDriver(deviceExtension->NextStackDevice, Irp);
}

NTSTATUS MyDrvDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
   NTSTATUS ntStatus;

   ntStatus = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
   IoCompleteRequest(Irp, IO_NO_INCREMENT);
   return ntStatus;
}
///////////////////////filter.h////////////////////////////
#include <ntddk.h>
#include "DebugPrint.h"

#ifdef __cplusplus
}
#endif

#define NT_DEVICE_NAME L"\\Device\\SeaCdromFilter"
#define DOS_DEVICE_NAME L"\\DosDevices\\SeaCdromFilter"

typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT    fdo;
    PDEVICE_OBJECT    NextStackDevice;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

PDEVICE_OBJECT fido;

BOOLEAN fSymbolicLink;

NTSTATUS MyAddDevice(IN PDRIVER_OBJECT DriverObject,
                     IN PDEVICE_OBJECT PhysicalDeviceObject);

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

NTSTATUS MyDrvDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);


xqchen
驱动牛犊
驱动牛犊
  • 注册日期2001-09-07
  • 最后登录2004-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-23 00:23
1. Please use Softice or WinDbg to debug it by yourself.
2. I can't understand what you were trying to do with this section of code.
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction = MySendToNextDriver;
}

I have never written a FS filter driver, and I don't know if this's the way filter driver should do in its driverentry. In general, you should handle IRP_MJ_CREATE and IRP_MJ_CLOSE in your own driver.
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
板凳#
发布于:2004-11-23 00:43
some 毛病 !!

 

2. I can't understand what you were trying to do with this section of code.
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction = MySendToNextDriver;
}

 

should look like this :

for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[ i ] = MySendToNextDriver;
}

Why you need this

IoSkipCurrentIrpStackLocation(Irp);

where is this PDEVICE_OBJECT pdo come from ??

PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo);


[编辑 -  11/23/04 by  KMK]
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
地板#
发布于:2004-11-23 02:34
 
PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo);


再多看是这里不对了.这pdo是不对,不是自己的pdo,是你想attach的pdo.

用IoGetDeviceObjectPointer()........

 :D
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-11-23 16:20
CreateService()可建立服务,只是修改注册表而已
startservice()则会进入到你的DRIVERENTRY里,所以下断点 即可.
而且从你的结构来看你的驱动应该属于WDM,即由系统加载,由PNP管理器来调用你的ADDDEVICE,所以你通过SERVICE方式来加载可能是不行的,因为虽然你在DRIVERENTRY里返回成功,但由于没有在里面创建设备对象,所以系统还是会删除你的驱动对象,从而返回失败,建议把你的驱动改为KMD的方式,或者通过WDM方式来安装驱动.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
michael4338
驱动小牛
驱动小牛
  • 注册日期2004-12-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分238分
  • 威望66点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-30 10:20
请问如何将WDM改为KMD?
我思故我在
游客

返回顶部