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

请高手看看问题

楼主#
更多 发布于:2004-11-18 13:25
我编的驱动加载时StartService()总是返回0,我想是因为驱动中的DriverEntry()没有返回STATUS_SUCCESS所引起的的吧,请看看我的
源码,找找问题,我的程序一个禁用光驱的驱动。
#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)
{
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;

    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)
{
    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
{
RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME);
        status = IoCreateSymbolicLink(&win32DeviceName, &ntDeviceName);
        if (!NT_SUCCESS(status))
{

}
else
{
   fSymbolicLink = TRUE;
}

PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;
        pdx->fdo = fido;

   PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo);
        pdx->NextStackDevice = fdo;

   fido->Flags |= fdo->Flags & (DO_DIRECT_IO|DO_BUFFERED_IO);
        fido->Flags |= DO_POWER_PAGABLE;
     //   fido->DeviceType = fdo->DeviceType;
    //    fido->Characteristics = fdo->Characteristics;
        fido->Flags &= ~DO_DEVICE_INITIALIZING;
}

    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 = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;

    IoSkipCurrentIrpStackLocation(Irp);
    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;
}
bj751212
驱动牛犊
驱动牛犊
  • 注册日期2004-10-11
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-18 13:40
StartService()返回0(Success)说明正常????看过MSDN吗老兄
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-18 15:04
不好意思,刚刚没仔细看你的问题。:(
不过应该不是你所说得原因,不知道你StartService返回0时,GetLastError是多少。
在交流中学习。。。
游客

返回顶部