亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pnp.c

?? 這個(gè)例程源碼演示了在WINDOWS 2000下
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*++

Copyright (c) 1990-2000 Microsoft Corporation, All Rights Reserved

Module Name:
    pnp.c

Abstract: 
    This is the code for handling PnP, Power and WMI IRPs

Author:
    Raju Ramanathan        02/22/2000

Enviroment:
    Kernel Mode Only

Revision History:

      Code cleaning   04/19/2000

--*/

#include <stdio.h>
#include "ntddk.h"
#include "debug.h"
#include "ramdisk.h"

PCSTR StateTable[] ={
    { "STOPPED"         },
    { "WORKING"         },
    { "PENDINGSTOP"     },
    { "PENDINGREMOVE"   },
    { "SURPRISEREMOVED" },
    { "REMOVED"         },
    { "UNKNOWN"         }
};

NTSTATUS
RamDiskAddDevice( 
    IN PDRIVER_OBJECT DriverObject, 
    IN PDEVICE_OBJECT PhysicalDeviceObject
    )
/*++ 
Routine Description:

    AddDevice routine to create the device object and symbolic link
    
Arguments:

    DriverObject            - Supplies the driver object

    PhysicalDeviceObject    - Supplies the physical device object
    
Return Value:

    NTSTATUS
    
--*/    
{

    PRAMDISK_DRIVER_EXTENSION   driverExtension;
    PDEVICE_OBJECT              functionDeviceObject;
    PDEVICE_EXTENSION           devExt;
    UNICODE_STRING              uniDeviceName;
    UNICODE_STRING              uniWin32Name;
    NTSTATUS                    status = STATUS_SUCCESS;
    
    PAGED_CODE();

    DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_VERBOSE, ("AddDevice - IN. DriverObject=(%p) Pdo=(%p) \n",
        DriverObject, PhysicalDeviceObject ) );

    // Get the Driver object extension 

    driverExtension = IoGetDriverObjectExtension(DriverObject,
                                                 RAMDISK_DRIVER_EXTENSION_KEY);

    ASSERT ( driverExtension != NULL );

	//
	// We are capable of handling only one device. If the we get AddDevice request 
	// for the next device, reject it
	//

	if ( driverExtension->DeviceInitialized == TRUE ) {

        DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("Device exists\n") );
		return STATUS_DEVICE_ALREADY_ATTACHED;
	}

    //
    // Create counted string version of our device name.
    //

    RtlInitUnicodeString( &uniDeviceName, NT_DEVICE_NAME );

    //
    // Create the device object
    //

    status = IoCreateDevice(
                DriverObject,
                sizeof(DEVICE_EXTENSION),
                &uniDeviceName,
                FILE_DEVICE_VIRTUAL_DISK,
                (FILE_DEVICE_SECURE_OPEN),
                FALSE,                 // This isn't an exclusive device
                &functionDeviceObject
                );

    if (!NT_SUCCESS(status)) {
        DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("IoCreateDevice error: 0x%x\n", status) );
        return status;        
    }
    DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_INFO, ("FDO created successfully (%p)\n",
        functionDeviceObject) );
    devExt = functionDeviceObject->DeviceExtension;

    RtlZeroMemory( devExt, sizeof(DEVICE_EXTENSION) );

    // Allocate buffer for storing the drive letter

    devExt->DiskRegInfo.DriveLetter.Buffer =  ExAllocatePoolWithTag( 
                            PagedPool, 
                            DRIVE_LETTER_LENGTH,
                            RAMDISK_TAG_GENERAL);
    if ( devExt->DiskRegInfo.DriveLetter.Buffer == NULL ) {
        DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("Can't allocate memory for drive letter\n") );
        RamDiskCleanUp( functionDeviceObject );
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    devExt->DiskRegInfo.DriveLetter.MaximumLength = DRIVE_LETTER_LENGTH;

    // 
    // Get the disk parameters from the registry
    //

    RamDiskQueryDiskRegParameters( &driverExtension->RegistryPath, &devExt->DiskRegInfo  );

    devExt->PhysicalDeviceObject = PhysicalDeviceObject;  // Save PDO pointer
    devExt->DeviceObject = functionDeviceObject;          // Save device object pointer
    devExt->DevState = STOPPED;                           // Device starts in Stopped state
    IoInitializeRemoveLock ( &devExt->RemoveLock, 
                            REMLOCK_TAG, 
                            REMLOCK_MAXIMUM, 
                            REMLOCK_HIGHWATER);

    // Set device flags

    functionDeviceObject->Flags |= DO_POWER_PAGABLE;
    functionDeviceObject->Flags |= DO_DIRECT_IO;

    //
    // Allocate the memory for disk image.
    //
    
    devExt->DiskImage = ExAllocatePoolWithTag( 
                            NonPagedPool, 
                            devExt->DiskRegInfo.DiskSize,
                            RAMDISK_TAG_DISK);
    
    if ( devExt->DiskImage == NULL )
    {
        DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("Can't allocate memory for disk image\n") );
        RamDiskCleanUp( functionDeviceObject );
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    // Format the disk

    RamDiskFormatDisk( functionDeviceObject );

    // Create symbolic link, which is the drive letter for the ramdisk

    devExt->SymbolicLink.Buffer = ExAllocatePoolWithTag( 
                            PagedPool, 
                            DOS_DEVNAME_LENGTH,
                            RAMDISK_TAG_GENERAL);

    if ( devExt->SymbolicLink.Buffer == NULL ) {
        DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("Can't allocate memory for symbolic link\n") );
        RamDiskCleanUp( functionDeviceObject );
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    RtlInitUnicodeString( &uniWin32Name, DOS_DEVICE_NAME );

    devExt->SymbolicLink.MaximumLength = DOS_DEVNAME_LENGTH;
    devExt->SymbolicLink.Length = uniWin32Name.Length;

    RtlCopyUnicodeString( &(devExt->SymbolicLink), &uniWin32Name );
    RtlAppendUnicodeStringToString( &(devExt->SymbolicLink), &(devExt->DiskRegInfo.DriveLetter) );

    DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_NOTIFY, ("Creating drive letter = %wZ\n",&(devExt->SymbolicLink) ) );

    // Create a drive letter from our device name to a name in the Win32 namespace.
    
    status = IoCreateSymbolicLink( &devExt->SymbolicLink, &uniDeviceName );

    if (!NT_SUCCESS(status)) {
        DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("IoCreateSymbolicLink error: 0x%x\n", status) );
        RamDiskCleanUp( functionDeviceObject );
        return status;
    }
    devExt->Flags |= FLAG_LINK_CREATED;

    devExt->LowerDeviceObject = 
        IoAttachDeviceToDeviceStack( functionDeviceObject, PhysicalDeviceObject );
    if ( devExt->LowerDeviceObject == NULL ) {
        DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("IoAttachDeviceToDeviceStack error\n") );
        RamDiskCleanUp( functionDeviceObject );
        return STATUS_NO_SUCH_DEVICE;      
    }

    driverExtension->DeviceInitialized = TRUE;

    // Clear DO_DEVICE_INITIALIZING flag

    functionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

    DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_VERBOSE, ("AddDevice - OUT. Fdo=(%p) LowerDevice=(%p)\n",
        functionDeviceObject, devExt->LowerDeviceObject ) );

    return status;
}  // End of RamDiskAddDevice()

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

    Dispatch routine for Plug and Play IRPs
    
Arguments:

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

Return Value:

    NTSTATUS
    
--*/    
{
    PIO_STACK_LOCATION  irpStack;
    PDEVICE_EXTENSION   devExt;
    KEVENT              event;
    NTSTATUS            status = STATUS_SUCCESS;
    BOOLEAN             lockHeld = TRUE;


    PAGED_CODE();

    irpStack = IoGetCurrentIrpStackLocation( Irp );
    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    ASSERT( devExt->DevState < MAX_STATE );

    DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_INFO, ("DispatchPnP - IN. Fdo=(%p) Irp=(%p) %s Device State=%s\n",
        DeviceObject, Irp, GetPnpIrpName(irpStack->MinorFunction), StateTable[devExt->DevState] ) );

    status = IoAcquireRemoveLock(&devExt->RemoveLock, Irp);
    if (!NT_SUCCESS(status)) {
        DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_ERROR, ("Acquire RemoveLock failed\n" ) );
        COMPLETE_REQUEST( Irp, status, 0 );
        return status;
    }

    switch (irpStack->MinorFunction) {
    
    case IRP_MN_START_DEVICE: {
        KeInitializeEvent( &event, NotificationEvent, FALSE);
        IoCopyCurrentIrpStackLocationToNext( Irp );
        IoSetCompletionRoutine( Irp, (PIO_COMPLETION_ROUTINE) RamDiskIoCompletionRoutine, 
                                (PVOID) &event, TRUE, TRUE, TRUE );
        status = IoCallDriver( devExt->LowerDeviceObject, Irp );
        if (status == STATUS_PENDING) {
            KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL );
        }
        if ( NT_SUCCESS(status) ) {
        //
        // Device started successfully by the lower driver
        //
            devExt->DevState = WORKING;
        }
        COMPLETE_REQUEST( Irp, status, 0 );
        break;
    }

    case IRP_MN_QUERY_STOP_DEVICE: {
        devExt->DevState = PENDINGSTOP;
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoSkipCurrentIrpStackLocation( Irp );
        status = IoCallDriver( devExt->LowerDeviceObject, Irp );
        break;
    }

    case IRP_MN_CANCEL_STOP_DEVICE: {
        //
        // Before sending the IRP down make sure we have received 
        // a IRP_MN_QUERY_STOP_DEVICE. We may get Cancel Stop 
        // without receiving a Query Stop earlier, if the 
        // driver on top fails a Query Stop and passes down the
        // Cancel Stop.
        //

        if ( devExt->DevState == PENDINGSTOP ) {
            devExt->DevState = WORKING;
            Irp->IoStatus.Status = STATUS_SUCCESS;
            IoSkipCurrentIrpStackLocation( Irp );
            status = IoCallDriver( devExt->LowerDeviceObject, Irp );
        } else {
            //
            // A spurious Cancel Stop request. Just complete it
            //
            status = STATUS_SUCCESS;
            COMPLETE_REQUEST( Irp, status, 0 );
        }
        break;
    }

    case IRP_MN_STOP_DEVICE: {
        devExt->DevState = STOPPED;
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoSkipCurrentIrpStackLocation( Irp );
        status = IoCallDriver( devExt->LowerDeviceObject, Irp );
        break;
    }


    case IRP_MN_QUERY_REMOVE_DEVICE: {
        devExt->DevState = PENDINGREMOVE;
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoSkipCurrentIrpStackLocation( Irp );
        status = IoCallDriver( devExt->LowerDeviceObject, Irp );
        break;
    }

    case IRP_MN_CANCEL_REMOVE_DEVICE: {
        //
        // Before sending the IRP down make sure we have received 
        // a IRP_MN_QUERY_REMOVE_DEVICE. We may get Cancel Remove 
        // without receiving a Query Remove earlier, if the 
        // driver on top fails a Query Remove and passes down the
        // Cancel Remove.
        //

        if ( devExt->DevState == PENDINGREMOVE ) {
            devExt->DevState = WORKING;
            Irp->IoStatus.Status = STATUS_SUCCESS;
            IoSkipCurrentIrpStackLocation( Irp );
            status = IoCallDriver( devExt->LowerDeviceObject, Irp );
        } else {
            //
            // A spurious Cancel Remove request. Just complete it
            //
            status = STATUS_SUCCESS;
            COMPLETE_REQUEST( Irp, status, 0 );
        }
        break;
    }

    case IRP_MN_SURPRISE_REMOVAL: {
        devExt->DevState = SURPRISEREMOVED;
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoSkipCurrentIrpStackLocation( Irp );
        status = IoCallDriver( devExt->LowerDeviceObject, Irp );
        break;
    }

    case IRP_MN_REMOVE_DEVICE: {
        RamDiskRemoveDevice( DeviceObject, Irp );
        //
        // Remove Lock released by RamDiskRemoveDevice
        //
        lockHeld = FALSE;

        break;
    }

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩亚洲欧美在线观看| 久久精品视频一区二区三区| 久久国产视频网| 中文字幕免费不卡在线| 欧美日韩一区不卡| 国产a区久久久| 天堂成人免费av电影一区| 国产亚洲精品中文字幕| 欧美精品视频www在线观看| 粉嫩在线一区二区三区视频| 亚洲专区一二三| 国产精品人妖ts系列视频| 制服.丝袜.亚洲.另类.中文 | 亚洲蜜臀av乱码久久精品| 精品国产欧美一区二区| 欧美中文字幕一区二区三区| 国产ts人妖一区二区| 日本在线观看不卡视频| 亚洲女厕所小便bbb| 国产欧美一区二区精品婷婷| 日韩欧美国产综合一区| 欧美在线免费观看视频| 99久久精品情趣| 丰满白嫩尤物一区二区| 国产麻豆成人精品| 国内不卡的二区三区中文字幕 | 久久亚洲影视婷婷| 91精品国产欧美一区二区成人 | 777午夜精品免费视频| 日本电影欧美片| 色av一区二区| 一本色道a无线码一区v| 成年人午夜久久久| 成人免费视频视频在线观看免费 | 欧美国产1区2区| 久久一留热品黄| 精品91自产拍在线观看一区| 91精品婷婷国产综合久久性色 | 欧美成人免费网站| 日韩免费在线观看| 日韩欧美在线一区二区三区| 88在线观看91蜜桃国自产| 欧美福利视频导航| 在线不卡一区二区| 欧美一区二区三区视频免费| 欧美一区二区视频观看视频| 7777精品伊人久久久大香线蕉的| 欧美日韩午夜在线| 欧美久久久影院| 欧美一卡二卡三卡| 欧美大片在线观看一区二区| 日韩你懂的在线播放| 国产午夜精品美女毛片视频| 国产女主播一区| 136国产福利精品导航| 亚洲免费在线视频| 亚洲无线码一区二区三区| 午夜精品一区在线观看| 日韩精品亚洲专区| 韩国三级中文字幕hd久久精品| 国内精品伊人久久久久av影院| 国产精品羞羞答答xxdd| av在线不卡网| 欧美亚洲尤物久久| 欧美电视剧免费全集观看| 国产欧美日韩在线观看| 亚洲欧美日韩国产成人精品影院| 亚洲综合自拍偷拍| 日韩电影在线一区二区| 国产精品资源在线看| 波多野结衣欧美| 欧美三级欧美一级| 久久综合色之久久综合| 国产精品久线在线观看| 亚洲一区影音先锋| 韩国视频一区二区| 色哟哟国产精品| 欧美成人精品3d动漫h| 中文字幕精品三区| 午夜精品久久一牛影视| 国产一区999| 日本韩国一区二区三区视频| 在线播放/欧美激情| 日本一区二区免费在线观看视频 | 奇米精品一区二区三区在线观看一| 国产精品色一区二区三区| 亚洲色图制服诱惑| 日本不卡视频在线观看| jiyouzz国产精品久久| 日本丰满少妇一区二区三区| 日韩午夜三级在线| 日韩经典一区二区| 一本色道久久综合亚洲91| 91精品欧美一区二区三区综合在 | 韩日欧美一区二区三区| 91在线porny国产在线看| 91精品国产综合久久久久| 欧美激情综合五月色丁香小说| 亚洲成人高清在线| 大陆成人av片| 精品乱码亚洲一区二区不卡| 一区二区三区四区在线免费观看| 精品一区二区国语对白| 欧美伊人久久久久久久久影院 | 欧美成人a在线| 亚洲成人中文在线| 99视频精品全部免费在线| 精品三级在线观看| 亚洲va欧美va天堂v国产综合| 风间由美一区二区av101| 日韩色视频在线观看| 亚洲妇女屁股眼交7| av电影一区二区| 国产片一区二区三区| 久久99国产精品久久| 欧美日韩不卡一区| 亚洲第一成年网| 色婷婷综合激情| 国产精品成人免费在线| 国产精品一区二区在线观看不卡| 欧美一区午夜视频在线观看| 亚洲精品中文在线观看| 成人一区二区在线观看| 久久久高清一区二区三区| 免费高清成人在线| 欧美精品日韩综合在线| 亚洲午夜精品在线| 欧美在线你懂的| 一区二区三区中文在线观看| 色婷婷综合久久久久中文一区二区 | 成人美女在线视频| 久久久久久久久久久电影| 欧美在线一区二区三区| 一区二区在线观看免费 | 精品va天堂亚洲国产| 蜜臀av一区二区三区| 91精品国产福利| 另类的小说在线视频另类成人小视频在线| 欧美日韩一区小说| 亚洲成人手机在线| 在线成人av影院| 七七婷婷婷婷精品国产| 国产欧美日韩在线| 成人精品一区二区三区四区| 国产精品久久久久久久岛一牛影视 | 精品一区二区三区免费观看| 日韩欧美亚洲国产精品字幕久久久| 日韩精品成人一区二区三区| 91精品国产入口| 久久国产视频网| 欧美极品xxx| 色先锋久久av资源部| 亚洲www啪成人一区二区麻豆| 69堂亚洲精品首页| 国产自产高清不卡| 成人免费在线播放视频| 欧美系列亚洲系列| 免费观看一级欧美片| 久久久av毛片精品| 北条麻妃一区二区三区| 亚洲男同性恋视频| 欧美精品久久天天躁| 久久不见久久见免费视频7| 国产日韩欧美亚洲| 91欧美一区二区| 日韩精品三区四区| 久久免费午夜影院| 91丨porny丨户外露出| 天天操天天色综合| 亚洲国产精品成人久久综合一区| 色菇凉天天综合网| 捆绑变态av一区二区三区| 久久久久综合网| 色88888久久久久久影院野外| 秋霞成人午夜伦在线观看| 国产日产欧美一区二区三区| 色悠久久久久综合欧美99| 人人爽香蕉精品| 亚洲欧美自拍偷拍| 日韩一区二区在线免费观看| 国产白丝网站精品污在线入口| 亚洲午夜精品久久久久久久久| 精品毛片乱码1区2区3区| 99精品一区二区三区| 日本在线观看不卡视频| 1024成人网色www| 日韩欧美国产一区在线观看| 不卡欧美aaaaa| 麻豆传媒一区二区三区| 亚洲欧美日韩国产综合| 久久天天做天天爱综合色| 日本道色综合久久| 国产精品一区2区| 日韩制服丝袜av| 亚洲丝袜另类动漫二区| 久久这里都是精品| 在线播放中文一区| 色综合久久中文综合久久97 | 高清日韩电视剧大全免费| 五月开心婷婷久久|