⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pnp.c

📁 本软件是一款可以把内存模拟为硬盘的驱动程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
    } // default

    } // switch

    //
    // Device Extenion is gone if the current IRP is IRP_MN_REMOVE_DEVICE
    //
    if ( lockHeld == TRUE ) {
        IoReleaseRemoveLock(&devExt->RemoveLock, Irp);
        DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_INFO, ("DispatchPnP - OUT. Device State=%s\n",
              StateTable[devExt->DevState] ) );
    }

    return status;
}  // End of RamDiskDispatchPnp()

NTSTATUS
RamDiskDispatchPower(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++ 
Routine Description:

    Dispatch routine for Power management IRPs
    
Arguments:

    DeviceObject    - Supplies the device object.
    
    Irp             - Supplies the I/O request packet. 

Return Value:

    NTSTATUS
    
--*/    
{
    PDEVICE_EXTENSION   devExt;
    NTSTATUS            status = STATUS_SUCCESS;

    PAGED_CODE();

    DBGPRINT( DBG_COMP_POWER, DBG_LEVEL_VERBOSE, ("DispatchPower - IN. Fdo=(%p) Irp=(%p)\n",
                                                        DeviceObject, Irp ) );
    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    //
    // If the device has been removed, the driver should not pass
    // the IRP down to the next lower driver.
    //

    if ( devExt->DevState == REMOVED) {
        PoStartNextPowerIrp( Irp );
        status = STATUS_DELETE_PENDING;
        COMPLETE_REQUEST( Irp, status, 0 );
        return status;
    }

    PoStartNextPowerIrp( Irp );
    IoSkipCurrentIrpStackLocation( Irp );

    DBGPRINT( DBG_COMP_POWER, DBG_LEVEL_VERBOSE, ("DispatchPower - OUT.\n" ) );

    return PoCallDriver( devExt->LowerDeviceObject, Irp );

}  // End of RamDiskDispatchPower()

NTSTATUS
RamDiskDispatchSystemControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++ 
Routine Description:

    Dispatch routine for WMI IRPs. It just forwards the 
    IRPs to the lower driver.
    
Arguments:

    DeviceObject    - Supplies the device object.
    
    Irp             - Supplies the I/O request packet. 

Return Value:

    NTSTATUS
    
--*/    
{
    PDEVICE_EXTENSION   devExt;

    PAGED_CODE();

    DBGPRINT( DBG_COMP_WMI, DBG_LEVEL_VERBOSE, ("DispatchSystemControl - IN. Fdo=(%p) Irp=(%p)\n",
        DeviceObject, Irp ) );

    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    IoSkipCurrentIrpStackLocation( Irp );
    DBGPRINT( DBG_COMP_WMI, DBG_LEVEL_VERBOSE, ("DispatchSystemControl - OUT.\n" ) );
    return IoCallDriver( devExt->LowerDeviceObject, Irp );

}  // End of RamDiskDispatchSystemControl()


NTSTATUS
RamDiskIoCompletionRoutine(
    IN PDEVICE_OBJECT  DeviceObject,
    IN PIRP            Irp,
    IN PKEVENT         Event
    )
/*++ 
Routine Description:

    Io completion routine
    
Arguments:

    DeviceObject    - Supplies the device object.
    
    Irp             - Supplies the I/O request packet. 

    Event           - Supplies the Event to be set.

Return Value:

    NTSTATUS
    
--*/    
{

    KeSetEvent( Event, 0, FALSE );
    return STATUS_MORE_PROCESSING_REQUIRED;

}  // End of RamDiskIoCompletionRoutine()


VOID
RamDiskCleanUp( 
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    This routine does the required cleaning like deleting the symbolic link
    releasjing the memory etc.

Arguments:

    DeviceObject - Supplies a pointer to the device object that represents
        the device whose capacity is to be read.

Return Value:

    None.

--*/
{
      
    PDEVICE_EXTENSION   devExt = DeviceObject->DeviceExtension;

    PAGED_CODE();
    DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_VERBOSE, ("RamDiskCleanUp\n" ) );
    
    if ( devExt->Flags & FLAG_LINK_CREATED ) {
        IoDeleteSymbolicLink( &devExt->SymbolicLink );
    }
    if ( devExt->SymbolicLink.Buffer ) {
        ExFreePool( devExt->SymbolicLink.Buffer );
    }
    if ( devExt->DiskRegInfo.DriveLetter.Buffer ) {
        ExFreePool( devExt->DiskRegInfo.DriveLetter.Buffer );
    }
    if ( devExt->DiskImage ) {
        ExFreePool( devExt->DiskImage );
    }
    if ( devExt->LowerDeviceObject ) {
        IoDetachDevice( devExt->LowerDeviceObject );
    }
    IoDeleteDevice( DeviceObject );

    return;
}

VOID
RamDiskRemoveDevice(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )

/*++

Routine Description:

    This routine releases the remove lock and calls RamDiskCleanUp
    to do the cleaning

Arguments:

    DeviceObject - Supplies a pointer to the device object that represents
        the device whose capacity is to be read.

Return Value:

    None.

--*/
{
    PDEVICE_EXTENSION           devExt = DeviceObject->DeviceExtension;
    PRAMDISK_DRIVER_EXTENSION   driverExtension;
    NTSTATUS                    status;

    PAGED_CODE();
    DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_VERBOSE, ("RemoveDevice\n" ) );

    #ifdef DBG
    status =
    #endif
    IoSetDeviceInterfaceState (  &devExt->SymbolicLink , FALSE ) ;
    #ifdef DBG
    if ( status != STATUS_SUCCESS )
    {
        DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_VERBOSE, ("IoSetDeviceInterfaceState : reports %d\n" , status ) );
    }
    #endif

    Irp->IoStatus.Status = STATUS_SUCCESS;
    IoSkipCurrentIrpStackLocation( Irp );
    status = IoCallDriver( devExt->LowerDeviceObject, Irp );


    //
    // Set the device status to REMOVED and wait for other drivers 
    // to release the lock, then delete the device object
    //
    devExt->DevState = REMOVED;
    IoReleaseRemoveLockAndWait(&devExt->RemoveLock, Irp);

    driverExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject,
                                             RAMDISK_DRIVER_EXTENSION_KEY);
    ASSERT ( driverExtension != NULL );
	driverExtension->DeviceInitialized = FALSE;

    RamDiskCleanUp( DeviceObject );

    DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_NOTIFY, ("Device Removed succesfully\n" ) );

    return;
} // end RamDiskRemoveDevice()


PSTR
GetPnpIrpName(
    IN UCHAR    PnpMinorFunction
    )
/*++ 
Routine Description:

    This function returns the minor function string for
    the given id.
    
Arguments:

    PnpMinorFunction    - Supplies the Minor function Irp id.
    
Return Value:

    PSTR    - Function name string
    
--*/    
{
    static char    functionName[80];

    PAGED_CODE();

    switch ( PnpMinorFunction ) {

        case IRP_MN_START_DEVICE:                 // 0x00
            return "IRP_MN_START_DEVICE";
            break;

        case IRP_MN_QUERY_REMOVE_DEVICE:          // 0x01
            return "IRP_MN_QUERY_REMOVE_DEVICE";
            break;

        case IRP_MN_REMOVE_DEVICE:                // 0x02
            return "IRP_MN_REMOVE_DEVICE";
            break;

        case IRP_MN_CANCEL_REMOVE_DEVICE:         // 0x03
            return "IRP_MN_CANCEL_REMOVE_DEVICE";
            break;

        case IRP_MN_STOP_DEVICE:                  // 0x04
            return "IRP_MN_STOP_DEVICE";
            break;

        case IRP_MN_QUERY_STOP_DEVICE:            // 0x05
            return "IRP_MN_QUERY_STOP_DEVICE";
            break;

        case IRP_MN_CANCEL_STOP_DEVICE:           // 0x06
            return "IRP_MN_CANCEL_STOP_DEVICE";
            break;

        case IRP_MN_QUERY_DEVICE_RELATIONS:       // 0x07
            return "IRP_MN_QUERY_DEVICE_RELATIONS";
            break;

        case IRP_MN_QUERY_INTERFACE:              // 0x08
            return "IRP_MN_QUERY_INTERFACE";
            break;

        case IRP_MN_QUERY_CAPABILITIES:           // 0x09
            return "IRP_MN_QUERY_CAPABILITIES";
            break;

        case IRP_MN_QUERY_RESOURCES:              // 0x0A
            return "IRP_MN_QUERY_RESOURCES";
            break;

        case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:  // 0x0B
            return "IRP_MN_QUERY_RESOURCE_REQUIREMENTS";
            break;

        case IRP_MN_QUERY_DEVICE_TEXT:            // 0x0C
            return "IRP_MN_QUERY_DEVICE_TEXT";
            break;

        case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: // 0x0D
            return "IRP_MN_FILTER_RESOURCE_REQUIREMENTS";
            break;

        case IRP_MN_READ_CONFIG:                  // 0x0F
            return "IRP_MN_READ_CONFIG";
            break;

        case IRP_MN_WRITE_CONFIG:                 // 0x10
            return "IRP_MN_WRITE_CONFIG";
            break;

        case IRP_MN_EJECT:                        // 0x11
            return "IRP_MN_EJECT";
            break;

        case IRP_MN_SET_LOCK:                     // 0x12
            return "IRP_MN_SET_LOCK";
            break;

        case IRP_MN_QUERY_ID:                     // 0x13
            return "IRP_MN_QUERY_ID";
            break;

        case IRP_MN_QUERY_PNP_DEVICE_STATE:       // 0x14
            return "IRP_MN_QUERY_PNP_DEVICE_STATE";
            break;

        case IRP_MN_QUERY_BUS_INFORMATION:        // 0x15
            return "IRP_MN_QUERY_BUS_INFORMATION";
            break;

        case IRP_MN_DEVICE_USAGE_NOTIFICATION:    // 0x16
            return "IRP_MN_DEVICE_USAGE_NOTIFICATION";
            break;

        case IRP_MN_SURPRISE_REMOVAL:             // 0x17
            return "IRP_MN_SURPRISE_REMOVAL";
            break;

        case IRP_MN_QUERY_LEGACY_BUS_INFORMATION: // 0x18
            return "IRP_MN_QUERY_LEGACY_BUS_INFORMATION";
            break;

        default:
            sprintf( functionName, "Unknown IRP(0x%x)", PnpMinorFunction );
            return functionName;
            break;

    }    // switch
}  // End of GetPnpIrpName()





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -