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

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

?? disk.h

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

Copyright (C) Microsoft Corporation, 1991 - 1999

Module Name:

    disk.c

Abstract:

    SCSI disk class driver

Environment:

    kernel mode only

Notes:

Revision History:

--*/

#include "ntddk.h"
#include "scsi.h"
#include <wmidata.h>
#include "classpnp.h"
#if defined(JAPAN) && defined(_X86_)
#include "machine.h"
#endif

#include <wmistr.h>

#if defined(_X86_)
#include "mountdev.h"
#endif

#ifdef ExAllocatePool
#undef ExAllocatePool
#define ExAllocatePool #assert(FALSE)
#endif

#define DISK_TAG_GENERAL        ' DcS'  // "ScD " - generic tag
#define DISK_TAG_SMART          'aDcS'  // "ScDa" - SMART allocations
#define DISK_TAG_INFO_EXCEPTION 'ADcS'  // "ScDA" - Info Exceptions
#define DISK_TAG_DISABLE_CACHE  'CDcS'  // "ScDC" - disable cache paths
#define DISK_TAG_CCONTEXT       'cDcS'  // "ScDc" - disk allocated completion context
#define DISK_TAG_DISK_GEOM      'GDcS'  // "ScDG" - disk geometry buffer
#define DISK_TAG_UPDATE_GEOM    'gDcS'  // "ScDg" - update disk geometry paths
#define DISK_TAG_SENSE_INFO     'IDcS'  // "ScDI" - sense info buffers
#define DISK_TAG_PNP_ID         'iDcS'  // "ScDp" - pnp ids
#define DISK_TAG_MODE_DATA      'MDcS'  // "ScDM" - mode data buffer
#define DISK_CACHE_MBR_CHECK    'mDcS'  // "ScDM" - mbr checksum code
#define DISK_TAG_NAME           'NDcS'  // "ScDN" - disk name code
#define DISK_TAG_READ_CAP       'PDcS'  // "ScDP" - read capacity buffer
#define DISK_TAG_PART_LIST      'pDcS'  // "ScDp" - disk partition lists
#define DISK_TAG_SRB            'SDcS'  // "ScDS" - srb allocation
#define DISK_TAG_START          'sDcS'  // "ScDs" - start device paths
#define DISK_TAG_UPDATE_CAP     'UDcS'  // "ScDU" - update capacity path
#define DISK_TAG_WI_CONTEXT     'WDcS'  // "ScDW" - work-item context

typedef
VOID
(*PDISK_UPDATE_PARTITIONS) (
    IN PDEVICE_OBJECT Fdo,
    IN OUT PDRIVE_LAYOUT_INFORMATION_EX PartitionList
    );

#if defined(_X86_)

//
// Disk device data
//

typedef enum _DISK_GEOMETRY_SOURCE {
    DiskGeometryUnknown,
    DiskGeometryFromBios,
    DiskGeometryFromPort,
    DiskGeometryFromNec98,
    DiskGeometryGuessedFromBios,
    DiskGeometryFromDefault
} DISK_GEOMETRY_SOURCE, *PDISK_GEOMETRY_SOURCE;
#endif

//

typedef struct _DISK_DATA {

    //
    // This field is the ordinal of a partition as it appears on a disk.
    //

    ULONG PartitionOrdinal;

    //
    // How has this disk been partitioned? Either EFI or MBR.
    //

    PARTITION_STYLE PartitionStyle;

    union {

        struct {

            //
            // Disk signature (from MBR)
            //

            ULONG Signature;

            //
            // MBR checksum
            //

            ULONG MbrCheckSum;

            //
            // Number of hidden sectors for BPB.
            //

            ULONG HiddenSectors;

            //
            // Partition type of this device object
            //
            // This field is set by:
            //
            //     1. Initially set according to the partition list entry
            //        partition type returned by IoReadPartitionTable.
            //
            //     2. Subsequently set by the
            //        IOCTL_DISK_SET_PARTITION_INFORMATION I/O control
            //        function when IoSetPartitionInformation function
            //        successfully updates the partition type on the disk.
            //

            UCHAR PartitionType;

            //
            // Boot indicator - indicates whether this partition is a
            // bootable (active) partition for this device
            //
            // This field is set according to the partition list entry boot
            // indicator returned by IoReadPartitionTable.
            //

            BOOLEAN BootIndicator;

        } Mbr;

        struct {

            //
            // The DiskGUID field from the EFI partition header.
            //

            GUID DiskId;

            //
            // Partition type of this device object.
            //

            GUID PartitionType;

            //
            // Unique partition identifier for this partition.
            //

            GUID PartitionId;

            //
            // EFI partition attributes for this partition.
            //

            ULONG64 Attributes;

            //
            // EFI partition name of this partition.
            //

            WCHAR PartitionName[36];

        } Efi;

    };  // unnamed union

    struct {
        //
        // This flag is set when the well known name is created (through
        // DiskCreateSymbolicLinks) and cleared when destroying it
        // (by calling DiskDeleteSymbolicLinks).
        //

        BOOLEAN WellKnownNameCreated : 1;

        //
        // This flag is set when the PhysicalDriveN link is created (through
        // DiskCreateSymbolicLinks) and is cleared when destroying it (through
        // DiskDeleteSymbolicLinks)
        //

        BOOLEAN PhysicalDriveLinkCreated : 1;

    } LinkStatus;

    //
    // ReadyStatus - STATUS_SUCCESS indicates that the drive is ready for
    // use.  Any error status is to be returned as an explaination for why
    // a request is failed.
    //
    // This was done solely for the zero-length partition case of having no
    // media in a removable disk drive.  When that occurs, and a read is sent
    // to the zero-length non-partition-zero PDO that was created, we had to
    // be able to fail the request with a reasonable value.  This may not have
    // been the best way to do this, but it works.
    //

    NTSTATUS ReadyStatus;

    //
    // Routine to be called when updating the disk partitions.  This routine
    // is different for removable and non-removable media and is called by
    // (among other things) DiskEnumerateDevice
    //

    PDISK_UPDATE_PARTITIONS UpdatePartitionRoutine;

    //
    // SCSI address used for SMART operations.
    //

    SCSI_ADDRESS ScsiAddress;

    //
    // Event used to synchronize partitioning operations and enumerations.
    //

    KEVENT PartitioningEvent;

    //
    // These unicode strings hold the disk and volume interface strings.  If
    // the interfaces were not registered or could not be set then the string
    // buffer will be NULL.
    //

    UNICODE_STRING DiskInterfaceString;
    UNICODE_STRING PartitionInterfaceString;

    //
    // What type of failure prediction mechanism is available
    //

    FAILURE_PREDICTION_METHOD FailurePredictionCapability;
    BOOLEAN AllowFPPerfHit;

#if defined(_X86_)
    //
    // This flag indiciates that a non-default geometry for this drive has
    // already been determined by the disk driver.  This field is ignored
    // for removable media drives.
    //

    DISK_GEOMETRY_SOURCE GeometrySource;

    //
    // If GeometryDetermined is TRUE this will contain the geometry which was
    // reported by the firmware or by the BIOS.  For removable media drives
    // this will contain the last geometry used when media was present.
    //

    DISK_GEOMETRY RealGeometry;
#endif

    //
    // Indicates that the cached partition table is valid when set.
    //

    ULONG CachedPartitionTableValid;

    //
    // The cached partition table - this is only valid if the previous
    // flag is set.  When invalidated the cached partition table will be
    // freed and replaced the next time one of the partitioning functions is
    // called.  This allows the error handling routines to invalidate it by
    // setting the flag and doesn't require that they obtain a lock.
    //

    PDRIVE_LAYOUT_INFORMATION_EX CachedPartitionTable;

    //
    // This mutex prevents more than one IOCTL_DISK_VERIFY from being
    // sent down to the disk. This greatly reduces the possibility of
    // a Denial-of-Service attack
    //

    KMUTEX VerifyMutex;

} DISK_DATA, *PDISK_DATA;

// Define a general structure of identfing disk controllers with bad
// hardware.
//

#define HackDisableTaggedQueuing            (0x01)
#define HackDisableSynchronousTransfers     (0x02)
#define HackDisableSpinDown                 (0x04)
#define HackDisableWriteCache               (0x08)
#define HackCauseNotReportableHack          (0x10)
#define HackRequiresStartUnitCommand        (0x20)
#define HackDisableWriteCacheNotSupported   (0x40)


#define DiskDeviceParameterSubkey           L"Disk"
#define DiskDeviceSpecialFlags              L"SpecialFlags"
#define DiskDeviceUserWriteCacheSetting     L"UserWriteCacheSetting"


#define FUNCTIONAL_EXTENSION_SIZE sizeof(FUNCTIONAL_DEVICE_EXTENSION) + sizeof(DISK_DATA)
#define PHYSICAL_EXTENSION_SIZE sizeof(PHYSICAL_DEVICE_EXTENSION) + sizeof(DISK_DATA)

#define MODE_DATA_SIZE      192
#define VALUE_BUFFER_SIZE  2048
#define SCSI_DISK_TIMEOUT    10
#define PARTITION0_LIST_SIZE  4

#define MAX_MEDIA_TYPES 4
typedef struct _DISK_MEDIA_TYPES_LIST {
    PCHAR VendorId;
    PCHAR ProductId;
    PCHAR Revision;
    const ULONG NumberOfTypes;
    const ULONG NumberOfSides;
    const STORAGE_MEDIA_TYPE MediaTypes[MAX_MEDIA_TYPES];
} DISK_MEDIA_TYPES_LIST, *PDISK_MEDIA_TYPES_LIST;

//
// WMI reregistration structures used for reregister work item
//
typedef struct
{
    SINGLE_LIST_ENTRY Next;
    PDEVICE_OBJECT DeviceObject;
    PIRP Irp;
} DISKREREGREQUEST, *PDISKREREGREQUEST;

//
// Write cache setting as defined by the user
//
typedef enum _DISK_USER_WRITE_CACHE_SETTING
{
    DiskWriteCacheDisable =  0,
    DiskWriteCacheEnable  =  1,
    DiskWriteCacheDefault = -1

} DISK_USER_WRITE_CACHE_SETTING, *PDISK_USER_WRITE_CACHE_SETTING;

#define MAX_SECTORS_PER_VERIFY              0x200

//
// This is based off 100ns units
//
#define ONE_MILLI_SECOND   ((ULONGLONG)10 * 1000)

//
// Context for the work-item
//
typedef struct _DISK_VERIFY_WORKITEM_CONTEXT
{
    PIRP Irp;
    PSCSI_REQUEST_BLOCK Srb;
    PIO_WORKITEM WorkItem;

} DISK_VERIFY_WORKITEM_CONTEXT, *PDISK_VERIFY_WORKITEM_CONTEXT;

//
// Poll for Failure Prediction every hour
//
#define DISK_DEFAULT_FAILURE_POLLING_PERIOD 1 * 60 * 60

//
// Static global lookup tables.
//

extern CLASSPNP_SCAN_FOR_SPECIAL_INFO DiskBadControllers[];
extern const DISK_MEDIA_TYPES_LIST DiskMediaTypes[];

//
// Macros
//

//
// Routine prototypes.
//


NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    );

VOID
DiskUnload(
    IN PDRIVER_OBJECT DriverObject
    );

NTSTATUS
DiskAddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT Pdo
    );

NTSTATUS
DiskInitFdo(
    IN PDEVICE_OBJECT Fdo
    );

NTSTATUS
DiskInitPdo(
    IN PDEVICE_OBJECT Pdo
    );

NTSTATUS
DiskStartFdo(
    IN PDEVICE_OBJECT Fdo
    );

NTSTATUS
DiskStartPdo(
    IN PDEVICE_OBJECT Pdo
    );

NTSTATUS
DiskStopDevice(
    IN PDEVICE_OBJECT DeviceObject,
    IN UCHAR Type
    );

NTSTATUS
DiskRemoveDevice(
    IN PDEVICE_OBJECT DeviceObject,
    IN UCHAR Type
    );

NTSTATUS
DiskReadWriteVerification(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
DiskDeviceControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图欧美偷拍| 精品动漫一区二区三区在线观看| 中文字幕不卡在线| 亚洲视频一区二区免费在线观看| 国产乱妇无码大片在线观看| 久久综合九色综合欧美98| 亚洲国产中文字幕在线视频综合| 国产自产v一区二区三区c| 中文字幕亚洲一区二区av在线| 欧美一区二区三区在线电影| 亚洲乱码国产乱码精品精可以看| 懂色av一区二区夜夜嗨| 国产精品污www在线观看| 粉嫩欧美一区二区三区高清影视| 久久精品无码一区二区三区| 国产毛片精品一区| 欧美激情一区二区在线| 26uuu亚洲| 亚洲国产精品综合小说图片区| 91精品婷婷国产综合久久竹菊| 久久国产欧美日韩精品| 国产精品对白交换视频| 91麻豆精品久久久久蜜臀| 国产一区二区成人久久免费影院 | 日韩电影免费在线看| 337p粉嫩大胆噜噜噜噜噜91av| 不卡的av中国片| 秋霞午夜av一区二区三区| 国产欧美日韩在线| 3d动漫精品啪啪| caoporen国产精品视频| 日本亚洲欧美天堂免费| 亚洲欧洲韩国日本视频| 日韩一区二区视频| 日本精品裸体写真集在线观看 | 午夜a成v人精品| 亚洲国产经典视频| 精品免费视频一区二区| 色婷婷久久久久swag精品| 国产一区二区三区四区五区入口 | 午夜精品国产更新| 国产精品午夜春色av| 欧美成人三级电影在线| 精品视频全国免费看| 成人黄色小视频在线观看| 蜜臀av一级做a爰片久久| 亚洲一区二区影院| 1024成人网| 国产精品午夜久久| 久久久久久免费| 欧美大片一区二区| 4438x亚洲最大成人网| 在线亚洲精品福利网址导航| 成人国产亚洲欧美成人综合网| 久久91精品国产91久久小草 | 夜夜精品视频一区二区 | 悠悠色在线精品| 国产女主播一区| 精品动漫一区二区三区在线观看| 欧美男人的天堂一二区| 日本高清不卡视频| 色综合久久精品| 色综合视频一区二区三区高清| 国产老妇另类xxxxx| 久久国产精品99精品国产 | 亚洲地区一二三色| 一区二区三区av电影| 亚洲免费成人av| 亚洲欧美成人一区二区三区| 中文字幕一区av| 亚洲男同性恋视频| 18欧美亚洲精品| 亚洲女人小视频在线观看| 亚洲欧美电影一区二区| 亚洲精品免费播放| 亚洲精品成人a在线观看| 一区二区三区日韩欧美| 一区二区不卡在线播放| 亚洲成人手机在线| 日日摸夜夜添夜夜添亚洲女人| 天天做天天摸天天爽国产一区| 亚洲自拍都市欧美小说| 午夜久久电影网| 日本欧美肥老太交大片| 久久99精品一区二区三区三区| 久久99精品国产91久久来源| 国产乱妇无码大片在线观看| 成人在线综合网| 91浏览器在线视频| 欧美日韩中文字幕一区二区| 91麻豆精品国产91久久久使用方法 | 激情图片小说一区| 国产91精品久久久久久久网曝门| 99久精品国产| 欧美日韩精品一区二区三区四区 | 高潮精品一区videoshd| 972aa.com艺术欧美| 欧美视频中文字幕| 日韩欧美另类在线| 欧美国产日产图区| 亚洲资源中文字幕| 精品无人码麻豆乱码1区2区| 国产a精品视频| 欧美自拍偷拍一区| 精品日韩欧美一区二区| 中文字幕一区免费在线观看| 午夜在线成人av| 国产一区二区美女| 欧洲一区在线观看| 精品国产乱码久久久久久浪潮| 国产精品久久久久四虎| 亚洲丰满少妇videoshd| 国产电影一区在线| 欧美三级日韩三级国产三级| 精品久久久久久最新网址| 亚洲色图清纯唯美| 久久国内精品自在自线400部| 波多野结衣中文字幕一区| 欧美一区二区三区成人| 中文字幕av一区二区三区| 日本最新不卡在线| 99热99精品| 欧美va日韩va| 亚洲成人中文在线| 成人综合在线观看| 日韩精品一区二区三区老鸭窝| 亚洲欧美偷拍三级| 国产一级精品在线| 欧美日本视频在线| 亚洲少妇中出一区| 国产精品一区2区| 91精品国产免费| 一区二区三区免费在线观看| 韩国v欧美v日本v亚洲v| 欧美日韩不卡视频| 亚洲欧美偷拍另类a∨色屁股| 国产乱色国产精品免费视频| 91精品国产全国免费观看| 亚洲欧美一区二区三区久本道91| 国产乱理伦片在线观看夜一区| 欧美高清视频一二三区| 亚洲永久精品国产| 91在线观看成人| 国产精品视频线看| 国产一区二区精品在线观看| 91精品国产综合久久精品| 亚洲国产乱码最新视频 | 久久综合一区二区| 美女诱惑一区二区| 在线播放欧美女士性生活| 悠悠色在线精品| 一本到不卡免费一区二区| 国产精品久久久久久久久搜平片 | 一区二区三区.www| 91麻豆国产福利精品| 中文字幕一区二区三区四区不卡 | 亚洲欧美怡红院| 成人激情视频网站| 国产视频在线观看一区二区三区 | 精品第一国产综合精品aⅴ| 美脚の诱脚舐め脚责91| 日韩精品一区二区三区老鸭窝| 日本 国产 欧美色综合| 日韩丝袜情趣美女图片| 蜜臀av亚洲一区中文字幕| 欧美大白屁股肥臀xxxxxx| 毛片av一区二区三区| 欧美成人a∨高清免费观看| 精品一区二区三区不卡| 亚洲精品在线网站| 国产成都精品91一区二区三| 国产精品三级av| zzijzzij亚洲日本少妇熟睡| 亚洲丝袜制服诱惑| 欧美色偷偷大香| 亚洲成人一区在线| 日韩天堂在线观看| 国产美女精品在线| 国产精品入口麻豆原神| 色先锋久久av资源部| 午夜日韩在线观看| 欧美精品一区二区三区很污很色的| 国产一区二区中文字幕| 久久久精品国产99久久精品芒果 | 欧美日韩一区二区欧美激情| 日日夜夜免费精品视频| 亚洲精品一区二区三区在线观看| 国产精品影视在线观看| 国产精品传媒入口麻豆| 欧美亚洲禁片免费| 久久99热99| 中文字幕在线免费不卡| 欧美日韩专区在线| 精品一区二区国语对白| 国产精品欧美精品| 欧美精品丝袜中出| 国产99精品国产| 首页综合国产亚洲丝袜| 国产午夜精品一区二区| 色爱区综合激月婷婷|