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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pnp.c

?? 這個例程源碼演示了在WINDOWS 2000下
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

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;
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产91久久综合桃花 | 欧美性一区二区| 国产精品系列在线| 成人一级片网址| 国产精品美女一区二区在线观看| 国产91精品欧美| 日韩伦理免费电影| 91福利社在线观看| 婷婷综合久久一区二区三区| 7777精品伊人久久久大香线蕉完整版| 午夜电影久久久| 欧美成人伊人久久综合网| 精品一区二区三区视频在线观看| 日韩精品中文字幕在线一区| 国产精品资源站在线| 国产精品国产成人国产三级 | 欧美午夜视频网站| 天堂一区二区在线| 2022国产精品视频| av亚洲产国偷v产偷v自拍| 一区二区视频免费在线观看| 69av一区二区三区| 国产成人综合视频| 亚洲精品久久嫩草网站秘色| 欧美伦理电影网| 国产成人欧美日韩在线电影| 亚洲欧美日韩在线| 欧美大片拔萝卜| av午夜精品一区二区三区| 婷婷综合另类小说色区| 国产欧美一区二区三区在线看蜜臀 | 欧美激情艳妇裸体舞| 91网上在线视频| 免费成人性网站| 欧美国产精品专区| 欧美日韩三级视频| 国产91丝袜在线播放九色| 亚洲资源在线观看| 国产三级精品视频| 欧美精品视频www在线观看| 国产精品99久久久久久宅男| 亚洲成人激情自拍| 国产亚洲午夜高清国产拍精品 | 欧美精品一区二区久久久| 99re8在线精品视频免费播放| 日韩在线观看一区二区| 亚洲欧美日韩久久| 久久久久久99久久久精品网站| 欧洲另类一二三四区| 国产一区二区视频在线| 亚洲电影第三页| 日韩毛片精品高清免费| 2021中文字幕一区亚洲| 67194成人在线观看| 色吊一区二区三区| 国产91精品入口| 国模娜娜一区二区三区| 亚洲一区二区黄色| 亚洲欧美偷拍卡通变态| 国产精品久久午夜| 国产亚洲污的网站| 337p粉嫩大胆噜噜噜噜噜91av| 欧美高清你懂得| 欧美三级欧美一级| 91色九色蝌蚪| 91香蕉视频在线| www.激情成人| www.欧美日韩国产在线| 本田岬高潮一区二区三区| 国产精品一区二区久激情瑜伽| 美女久久久精品| 人人精品人人爱| 秋霞国产午夜精品免费视频| 午夜视频一区二区| 天天av天天翘天天综合网| 亚洲国产婷婷综合在线精品| 一区二区在线看| 中文字幕综合网| 欧美日韩成人一区二区| 91亚洲永久精品| 国产成人三级在线观看| 激情文学综合丁香| 日韩1区2区日韩1区2区| 国产精品女同互慰在线看| 日本一区二区免费在线 | 国产成a人无v码亚洲福利| 青青草原综合久久大伊人精品优势 | 亚洲精品亚洲人成人网在线播放| 国产婷婷色一区二区三区四区 | 色哟哟精品一区| caoporn国产一区二区| 国产不卡在线一区| 国产最新精品免费| 激情深爱一区二区| 日精品一区二区三区| 蜜桃视频在线观看一区| 日本欧美一区二区| 日韩国产在线观看| 日本亚洲一区二区| 麻豆精品视频在线观看视频| 三级久久三级久久| 日本v片在线高清不卡在线观看| 一区二区三区四区在线| 日韩av网站免费在线| 麻豆久久一区二区| 免费成人在线播放| 黄一区二区三区| 国产a区久久久| 成人的网站免费观看| 国产乱一区二区| 91国内精品野花午夜精品 | 欧美无人高清视频在线观看| 欧美片网站yy| 欧美大片拔萝卜| 国产嫩草影院久久久久| 日韩美女视频一区| 日韩制服丝袜av| 国产精品亚洲成人| 99riav一区二区三区| 欧洲中文字幕精品| 欧美一区二区在线看| 久久综合九色综合97婷婷| 精品第一国产综合精品aⅴ| 精品国产乱码久久久久久免费| 国产亚洲欧美日韩日本| 国产精品美日韩| 日本中文字幕一区二区视频 | 国产日韩欧美精品一区| 一区二区高清免费观看影视大全| 亚洲一级二级三级| 国产精品夜夜嗨| 欧美综合色免费| 久久综合一区二区| 自拍偷拍欧美激情| 奇米888四色在线精品| 粉嫩高潮美女一区二区三区| 一本色道亚洲精品aⅴ| 欧美喷水一区二区| 国产蜜臀97一区二区三区 | 国产精品久久毛片av大全日韩| 亚洲高清免费视频| 韩国成人在线视频| 欧美在线视频全部完| 国产精品入口麻豆九色| 日本成人在线电影网| aaa欧美大片| 欧美tickling挠脚心丨vk| 日韩美女视频一区二区| 国产一区二区视频在线| 色欧美日韩亚洲| 亚洲欧美在线另类| 精品亚洲成av人在线观看| 日本乱码高清不卡字幕| 久久先锋影音av鲁色资源网| 亚洲成人在线免费| 99精品视频免费在线观看| 日韩欧美一级二级| 亚洲午夜电影网| 国产精品88888| 91精品国产麻豆| 亚洲一区二区综合| 99久久精品情趣| 久久久精品免费观看| 免费在线看成人av| 欧美视频在线观看一区二区| 国产精品素人视频| 精品一区二区精品| 欧美男人的天堂一二区| 亚洲乱码日产精品bd| 春色校园综合激情亚洲| 精品噜噜噜噜久久久久久久久试看 | 色婷婷av一区二区三区软件| 国产精品久久看| 韩国女主播一区| 国产蜜臀97一区二区三区| 韩国视频一区二区| 日韩一区二区三区电影| 亚洲一区二区av在线| 91高清视频在线| 一区二区三区四区在线播放 | 国产一区二区三区四区五区入口| 欧美美女网站色| 亚洲精品成人悠悠色影视| aaa欧美色吧激情视频| 中文字幕日韩精品一区| 懂色一区二区三区免费观看| 日韩欧美资源站| 国产精品99久久不卡二区| 国产午夜亚洲精品理论片色戒| 国产毛片精品国产一区二区三区| 欧美成人精精品一区二区频| 老司机一区二区| 日韩欧美一卡二卡| 成人av在线电影| 亚洲人123区| 欧美亚洲综合久久| 午夜亚洲国产au精品一区二区| 91国内精品野花午夜精品| 免费在线观看精品| 精品久久久久99|