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

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

?? enum.c

?? The Disk sample is used with Classpnp.sys as disk driver. The sample supports Plug and Play, Power M
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*++

Copyright (C) Microsoft Corporation, 1991 - 1999

Module Name:

    pnp.c

Abstract:

    SCSI disk class driver

Environment:

    kernel mode only

Notes:

Revision History:

--*/

#include "disk.h"

#ifdef ALLOC_PRAGMA

#pragma alloc_text(PAGE, DiskConvertExtendedToLayout)
#pragma alloc_text(PAGE, DiskConvertPartitionToExtended)
#pragma alloc_text(PAGE, DiskConvertLayoutToExtended)
#pragma alloc_text(PAGE, DiskCreatePdo)
#pragma alloc_text(PAGE, DiskEnumerateDevice)
#pragma alloc_text(PAGE, DiskUpdateRemovablePartitions)
#pragma alloc_text(PAGE, DiskUpdatePartitions)
#pragma alloc_text(PAGE, DiskCreatePdo)

#endif

PDRIVE_LAYOUT_INFORMATION
DiskConvertExtendedToLayout(
    IN CONST PDRIVE_LAYOUT_INFORMATION_EX LayoutEx
    )
{
    ULONG i;
    ULONG LayoutSize;
    PDRIVE_LAYOUT_INFORMATION Layout;
    PPARTITION_INFORMATION Partition;
    PPARTITION_INFORMATION_EX PartitionEx;

    PAGED_CODE ();

    ASSERT ( LayoutEx );


    //
    // The only valid conversion is from an MBR extended layout structure to
    // the old structure.
    //
    
    if (LayoutEx->PartitionStyle != PARTITION_STYLE_MBR) {
        ASSERT ( FALSE );
        return NULL;
    }

    LayoutSize = FIELD_OFFSET (DRIVE_LAYOUT_INFORMATION, PartitionEntry[0]) +
                 LayoutEx->PartitionCount * sizeof (PARTITION_INFORMATION);
    
    Layout = ExAllocatePoolWithTag (
                    NonPagedPool,
                    LayoutSize,
                    DISK_TAG_PART_LIST
                    );

    if ( Layout == NULL ) {
        return NULL;
    }
    
    Layout->Signature = LayoutEx->Mbr.Signature;
    Layout->PartitionCount = LayoutEx->PartitionCount;

    for (i = 0; i < LayoutEx->PartitionCount; i++) {

        Partition = &Layout->PartitionEntry[i];
        PartitionEx = &LayoutEx->PartitionEntry[i];

        Partition->StartingOffset = PartitionEx->StartingOffset;
        Partition->PartitionLength = PartitionEx->PartitionLength;
        Partition->RewritePartition = PartitionEx->RewritePartition;
        Partition->PartitionNumber = PartitionEx->PartitionNumber;

        Partition->PartitionType = PartitionEx->Mbr.PartitionType;
        Partition->BootIndicator = PartitionEx->Mbr.BootIndicator;
        Partition->RecognizedPartition = PartitionEx->Mbr.RecognizedPartition;
        Partition->HiddenSectors = PartitionEx->Mbr.HiddenSectors;
    }

    return Layout;
}

VOID
DiskConvertPartitionToExtended(
    IN PPARTITION_INFORMATION Partition,
    OUT PPARTITION_INFORMATION_EX PartitionEx
    )

/*++

Routine Description:

    Convert a PARTITION_INFORMATION structure to a PARTITION_INFORMATION_EX
    structure. 

Arguments:

    Partition - A pointer to the PARTITION_INFORMATION structure to convert.

    PartitionEx - A pointer to a buffer where the converted
        PARTITION_INFORMATION_EX structure is to be stored.

Return Values:

    None.

--*/

{
    PAGED_CODE ();

    ASSERT ( PartitionEx != NULL );
    ASSERT ( Partition != NULL );

    PartitionEx->PartitionStyle = PARTITION_STYLE_MBR;
    PartitionEx->StartingOffset = Partition->StartingOffset;
    PartitionEx->PartitionLength = Partition->PartitionLength;
    PartitionEx->RewritePartition = Partition->RewritePartition;
    PartitionEx->PartitionNumber = Partition->PartitionNumber;

    PartitionEx->Mbr.PartitionType = Partition->PartitionType;
    PartitionEx->Mbr.BootIndicator = Partition->BootIndicator;
    PartitionEx->Mbr.RecognizedPartition = Partition->RecognizedPartition;
    PartitionEx->Mbr.HiddenSectors = Partition->HiddenSectors;
}


PDRIVE_LAYOUT_INFORMATION_EX 
DiskConvertLayoutToExtended(
    IN CONST PDRIVE_LAYOUT_INFORMATION Layout
    )

/*++

Routine Description:

    Convert a DRIVE_LAYOUT_INFORMATION structure into a
    DRIVE_LAYOUT_INFORMATION_EX structure.

Arguments:

    Layout - The source DRIVE_LAYOUT_INFORMATION structure.

Return Values:

    The resultant DRIVE_LAYOUT_INFORMATION_EX structure. This buffer must
    be freed by the callee using ExFreePool.

--*/
    
{
    ULONG i;
    ULONG size;
    PDRIVE_LAYOUT_INFORMATION_EX layoutEx;

    PAGED_CODE ();

    ASSERT ( Layout != NULL );
    

    //
    // Allocate enough space for a DRIVE_LAYOUT_INFORMATION_EX structure
    // plus as many PARTITION_INFORMATION_EX structures as are in the
    // source array.
    //
    
    size = FIELD_OFFSET (DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry[0]) +
            Layout->PartitionCount * sizeof ( PARTITION_INFORMATION_EX );
            
    layoutEx = ExAllocatePoolWithTag(
                            NonPagedPool,
                            size,
                            DISK_TAG_PART_LIST
                            );

    if ( layoutEx == NULL ) {
        return NULL;
    }
    
    //
    // Convert the disk information.
    //
    
    layoutEx->PartitionStyle = PARTITION_STYLE_MBR;
    layoutEx->PartitionCount = Layout->PartitionCount;
    layoutEx->Mbr.Signature = Layout->Signature;
    
    for (i = 0; i < Layout->PartitionCount; i++) {

        //
        // Convert each entry.
        //
        
        DiskConvertPartitionToExtended (
                &Layout->PartitionEntry[i],
                &layoutEx->PartitionEntry[i]
                );
    }

    return layoutEx;
}



NTSTATUS
DiskEnumerateDevice(
    IN PDEVICE_OBJECT Fdo
    )

/*++

Routine Description:

    This routine is called by the class driver to update the PDO list off
    of this FDO.  The disk driver also calls it internally to re-create
    device objects.

    This routine will read the partition table and create new PDO objects as
    necessary.  PDO's that no longer exist will be pulled out of the PDO list
    so that pnp will destroy them.

Arguments:

    Fdo - a pointer to the FDO being re-enumerated

Return Value:

    status

--*/

{
    PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension;
    PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension;

    PPHYSICAL_DEVICE_EXTENSION pdoExtension = NULL;

    PDISK_DATA diskData = (PDISK_DATA) commonExtension->DriverData;

    PDEVICE_OBJECT pdo = NULL;

    ULONG numberListElements = 0;

    PDRIVE_LAYOUT_INFORMATION_EX partitionList;

    NTSTATUS status;

    ASSERT(commonExtension->IsFdo);

    PAGED_CODE();

    //
    // Update our image of the size of the drive.  This may be necessary if
    // the drive size is extended or we just released a reservation to 
    // ensure the kernel doesn't reject the partition table.
    //

    DiskReadDriveCapacity(Fdo);

    //
    // Lock out anyone else trying to repartition the disk.
    //

    DiskAcquirePartitioningLock(fdoExtension);

    //
    // Create objects for all the partitions on the device.
    //

    status = DiskReadPartitionTableEx(fdoExtension, FALSE, &partitionList);

    //
    // If the I/O read partition table failed and this is a removable device,
    // then fix up the partition list to make it look like there is one
    // zero length partition.
    //

    if ((!NT_SUCCESS(status) || partitionList->PartitionCount == 0) &&
         Fdo->Characteristics & FILE_REMOVABLE_MEDIA) {

        SIZE_T partitionListSize;

        //
        // Remember whether the drive is ready.
        //

        diskData->ReadyStatus = status;

        //
        // Allocate and zero a partition list.
        //

        partitionListSize = 
            FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry[1]);
                            
        partitionList = ExAllocatePoolWithTag(NonPagedPool,
                                              partitionListSize,
                                              DISK_TAG_PART_LIST);

        if (partitionList != NULL) {

            RtlZeroMemory( partitionList, partitionListSize );

            //
            // Set the partition count to one and the status to success
            // so one device object will be created. Set the partition type
            // to a bogus value.
            //

            partitionList->PartitionStyle = PARTITION_STYLE_MBR;
            partitionList->PartitionCount = 1;

            status = STATUS_SUCCESS;
        } else {
            status = STATUS_INSUFFICIENT_RESOURCES;
        }
    }

    if (NT_SUCCESS(status)) {

        diskData->UpdatePartitionRoutine(Fdo, partitionList);
        
        //
        // Record disk signature.  
        //

        if (partitionList->PartitionStyle == PARTITION_STYLE_MBR) {

            diskData->PartitionStyle = PARTITION_STYLE_MBR;
            diskData->Mbr.Signature = partitionList->Mbr.Signature;

        } else {

            diskData->PartitionStyle = PARTITION_STYLE_GPT;
            diskData->Efi.DiskId = partitionList->Gpt.DiskId;
        }
    }

    DiskReleasePartitioningLock(fdoExtension);

    return(STATUS_SUCCESS);

} // end DiskEnumerateDevice()


VOID
DiskUpdateRemovablePartitions(
    IN PDEVICE_OBJECT Fdo,
    IN OUT PDRIVE_LAYOUT_INFORMATION_EX PartitionList
    )

/*++

Routine Description:

    This routine is called by the class DLL to update the PDO list off of this
    FDO.  The disk driver also calls it internally to re-create device objects.

    This routine will read the partition table and update the size of the
    single partition device object which always exists for removable devices.

Arguments:

    Fdo - a pointer to the FDO being reenumerated.

Return Value:

    status

--*/

{

    PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension;

    PPHYSICAL_DEVICE_EXTENSION pdoExtension = NULL;

    ULONG partitionCount;

    ULONG partitionNumber;
    ULONG partitionOrdinal = 0;
    ULONG newPartitionNumber;

    PDISK_DATA pdoData;
    NTSTATUS status;

    PPARTITION_INFORMATION_EX partitionEntry;
    PARTITION_STYLE partitionStyle;

    PAGED_CODE();

    ASSERT(Fdo->Characteristics & FILE_REMOVABLE_MEDIA);

    partitionStyle = PartitionList->PartitionStyle;
    partitionCount = PartitionList->PartitionCount;

    for(partitionNumber = 0;
        partitionNumber < partitionCount;
        partitionNumber++) {

        partitionEntry = &(PartitionList->PartitionEntry[partitionNumber]);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂午夜影视日韩欧美一区二区| 天天色图综合网| 亚洲尤物在线视频观看| 美女网站一区二区| 91视频在线观看免费| 欧美一区二区三区视频在线| 亚洲国产岛国毛片在线| 午夜精品久久久久久久99樱桃| 丁香婷婷综合激情五月色| 制服丝袜激情欧洲亚洲| 亚洲欧美另类综合偷拍| 国产999精品久久久久久| 日韩丝袜美女视频| 亚洲成人精品影院| 在线欧美日韩精品| 国产精品国产a级| 国产精品伊人色| 精品日韩在线观看| 日本欧美大码aⅴ在线播放| 欧美在线视频全部完| 综合久久一区二区三区| 成人网男人的天堂| 国产婷婷一区二区| 国产一区高清在线| 久久综合九色综合欧美就去吻| 日韩精品一二三区| 91精品国产综合久久福利软件| 亚洲欧美另类久久久精品| 成人黄色电影在线 | 欧美中文字幕一区二区三区| 中文字幕不卡在线观看| 高潮精品一区videoshd| 久久亚洲一区二区三区四区| 极品瑜伽女神91| 久久综合久久鬼色中文字| 久久国产精品99精品国产| 精品国产制服丝袜高跟| 丁香桃色午夜亚洲一区二区三区| 国精品**一区二区三区在线蜜桃| 欧美一区三区二区| 九九九久久久精品| 欧美精品一区二区三区视频| 激情欧美日韩一区二区| 久久亚洲精品国产精品紫薇| 国产精品99久久不卡二区| 国产亚洲一区二区三区四区| 成人一区二区在线观看| 亚洲少妇最新在线视频| 在线一区二区视频| 日韩精品一级二级 | 中文字幕在线一区| av不卡免费在线观看| 亚洲精品视频在线看| 欧美午夜精品一区二区三区| 蜜桃视频一区二区三区| 国产网红主播福利一区二区| 色婷婷综合久色| 人禽交欧美网站| 国产日韩欧美激情| 日本福利一区二区| 蜜臀精品一区二区三区在线观看| 精品1区2区在线观看| 91在线看国产| 五月天欧美精品| 国产日韩欧美麻豆| 欧美性猛交xxxx黑人交| 久久国产精品第一页| 日韩一区日韩二区| 日韩欧美另类在线| 91丨porny丨最新| 六月丁香婷婷久久| 亚洲综合久久av| 久久精品欧美日韩| 欧美日韩一区二区三区四区五区| 久99久精品视频免费观看| √…a在线天堂一区| 欧美一级黄色大片| av不卡免费电影| 激情综合色播五月| 亚洲高清免费一级二级三级| 国产精品视频免费| 精品乱人伦小说| 欧美日韩亚洲高清一区二区| 国产麻豆精品久久一二三| 亚洲va韩国va欧美va| 国产精品毛片久久久久久久| 日韩一二三区视频| 欧美无人高清视频在线观看| 东方欧美亚洲色图在线| 久久不见久久见中文字幕免费| 亚洲丝袜自拍清纯另类| 欧美精品一区二区三区久久久 | 亚洲123区在线观看| 中文幕一区二区三区久久蜜桃| 欧美一区二区播放| 欧美日韩精品一区视频| 99精品久久久久久| 成人免费观看视频| 国产精品一区二区不卡| 久久99精品久久久久久久久久久久| 成人深夜在线观看| 日本aⅴ亚洲精品中文乱码| 亚洲免费av在线| 亚洲欧洲日本在线| 国产精品三级av| 亚洲国产精品t66y| 亚洲国产精品99久久久久久久久 | 午夜精品一区二区三区三上悠亚| **欧美大码日韩| 国产精品久久久久一区二区三区共| 精品粉嫩aⅴ一区二区三区四区 | 日韩国产一二三区| 亚洲大型综合色站| 怡红院av一区二区三区| 亚洲免费伊人电影| 一区二区三区日韩欧美| 久久综合色婷婷| 欧美一卡2卡三卡4卡5免费| 欧美少妇xxx| 欧洲激情一区二区| 欧美日韩精品一区二区三区蜜桃 | 99在线精品视频| 9色porny自拍视频一区二区| 99re视频这里只有精品| 六月婷婷色综合| 久久国产综合精品| 精品一区二区三区久久久| 国产一区二区三区黄视频| 国产精品2024| 成人听书哪个软件好| 成人黄页毛片网站| 91福利精品第一导航| 在线看国产一区| 91麻豆精品国产91久久久| 日韩欧美中文字幕精品| 2020国产精品| 一区在线中文字幕| 污片在线观看一区二区| 久久超级碰视频| 成人黄色电影在线 | 日韩av在线播放中文字幕| 日韩专区欧美专区| 国产一二精品视频| 91美女在线视频| 日韩无一区二区| 国产精品福利一区| 肉肉av福利一精品导航| 国产一区二区三区免费在线观看| 波多野结衣精品在线| 欧美美女网站色| 久久久久久久久免费| 一区二区三区蜜桃| 精品在线视频一区| 在线日韩av片| 26uuu精品一区二区三区四区在线| 国产精品美女视频| 青青草原综合久久大伊人精品| 国产精品资源在线观看| 欧美性猛交xxxx黑人交| 国产人成一区二区三区影院| 亚洲国产欧美在线人成| 国产精品 欧美精品| 在线观看日韩电影| 国产午夜精品一区二区| 婷婷成人综合网| 成人av片在线观看| 精品伦理精品一区| 亚洲成人av福利| 99久久伊人久久99| 26uuu久久天堂性欧美| 首页综合国产亚洲丝袜| 99久久99久久综合| 国产午夜精品一区二区三区嫩草| 日韩av网站免费在线| 成人久久18免费网站麻豆| 欧美日韩一级大片网址| 国产精品乱码妇女bbbb| 黑人巨大精品欧美一区| 91精品在线一区二区| 亚洲色图视频网| 成人av中文字幕| 久久免费的精品国产v∧| 蜜乳av一区二区| 欧美日韩在线免费视频| 亚洲欧美日韩国产一区二区三区 | 国产综合色视频| 欧美精品乱码久久久久久按摩| 最新热久久免费视频| 日本成人在线一区| 91成人国产精品| 樱桃视频在线观看一区| av一区二区久久| 久久人人97超碰com| 亚洲国产日日夜夜| 99re热这里只有精品免费视频| 国产日本一区二区| 国产98色在线|日韩| 国产精品久久久久精k8 | 欧美老肥妇做.爰bbww视频| 尤物av一区二区|