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

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

?? init.c

?? 硬盤驅動的例子
?? C
?? 第 1 頁 / 共 3 頁
字號:

            if (controllerData->InterruptObject != NULL) 
            {

                IoDisconnectInterrupt(controllerData->InterruptObject);
            }

        //
        // and now free the allocated data
        //
        ExFreePool(controllerData);
    }

    return ntStatus;
}



///////////////////////////////////////////////////////////////////////////////
//
//	InitializeDisk
//
//    This routine initializes the disk
//
//	INPUTS:
//
//    ConfigData        - pointer to the configuration data
//    DriverObject      - pointer to our driver object
//    ControllerData - pointer to CONTROLLER_DATA data
//
//	OUTPUTS:
//	
//    None.
//
//	RETURNS:
//
//    STATUS_SUCCESS if the disk initializes, otherwise an error code
//
//      IRQL:
//
//    IRQL_PASSIVE_LEVEL
//
//	NOTES:
//
//    This assumes:
//
//      - controller has been initialized and/or reset
//      - interrupts have been enabled
//
//    Here we:
//      
//      - create a directory for the device object
//      - allocates and initializes device object for the disk
//      - set the drive parameters
//      - reads the partition table
//      - allocates/initializes a partition object
//
//
///////////////////////////////////////////////////////////////////////////////

static NTSTATUS
InitializeDisk(IN PDRIVER_OBJECT DriverObject,
                IN PCONFIG_DATA ConfigData,
                IN OUT PCONTROLLER_DATA ControllerData)
{
    UCHAR       partitionNameBuffer[256];       // temp Ansi buffer
    STRING      partitionNameString;            // temp Ansi string 
    UNICODE_STRING      unicodeString;          // temp UNICODE string
    PDRIVE_LAYOUT_INFORMATION partitionList;    // for the partition table
    OBJECT_ATTRIBUTES objectAttributes;         // for the directory object
    HANDLE handle = NULL;                       // handle of directory object
    PDEVICE_OBJECT deviceObject = NULL;         // ptr to part 0 device object
    PDEVICE_OBJECT partitionObject;             // ptr to a part x device object
    PDEVICE_OBJECT nextPartition;               // ptr for walking chain
    PDEVICE_OBJECT *partitionPointer;
    PIDE_DEV_EXT devExt = NULL;                 // ptr to device extension
    PPARTITION_DATA partitionData;              // ptr to partition extension
    NTSTATUS ntStatus;
    ULONG partitionNumber;

    //
    // Generate a directory object for the partition
    //
    sprintf(partitionNameBuffer,"\\Device\\Harddisk%d",*(ConfigData->HardDiskCount));

    //
    // initialize the STRING structure with the constructed 
    // partitionNamebuffer in preparation to the conversion of this
    // Ansi string to UNICODE
    //
    RtlInitString(&partitionNameString, partitionNameBuffer);

    //
    // convert the Ansi string to UNICODE
    //
    ntStatus = RtlAnsiStringToUnicodeString(&unicodeString,
                                            &partitionNameString,
                                            TRUE);

    //
    // if we couldn't convert the string, then we've failed
    //
    if (!NT_SUCCESS(ntStatus)) {

        DbgPrint("InitializeDisk: Couldn't create the unicode device name\n");

        goto InitializeDiskExit;

    }

    //
    // Initialzie the object attributes structure for a subsequent Zw 
    // call to create the directory
    //
    InitializeObjectAttributes(&objectAttributes,
                                &unicodeString,
                                OBJ_PERMANENT,
                                NULL,
                                NULL);

    //
    // Create the directory
    //
    ntStatus = ZwCreateDirectoryObject(&handle,
                                        DIRECTORY_ALL_ACCESS,
                                        &objectAttributes);

    //
    // Since we're done with the UNICODE string (no matter what the
    // results of ZwCreateDirectoryObject()), we free the structure
    // now so we don't forget later on.
    //
    RtlFreeUnicodeString(&unicodeString);

    //
    // If we fail on the ZwCreateDirectoryObject(), then we've failed
    // initialization and we need to report back
    //
    if (!NT_SUCCESS(ntStatus)) {

        DbgPrint("InitializeDisk: Couldn't create the directory object\n");

        goto InitializeDiskExit;
    }

    //
    // Alter the attributes for the directory to be temporary, so that
    // if/when the handle count on the object goes to zero, it will be
    // deleted
    //
    ZwMakeTemporaryObject(handle);

    //
    // create partition 0 object
    //
    sprintf(partitionNameBuffer,
            "\\Device\\Harddisk%d\\Partition0",
            *(ConfigData->HardDiskCount));

    //
    // setup the ansi string for the UNICODE conversion
    //
    RtlInitString(&partitionNameString, partitionNameBuffer);

    ntStatus = RtlAnsiStringToUnicodeString(&unicodeString,
                                            &partitionNameString,
                                            TRUE);

    //
    // fail initialization if we can't get the UNICODE string 
    //
    if (!NT_SUCCESS(ntStatus)) {

        DbgPrint("InitializeDisk: Couldn't create the partition unicode name\n");

        goto InitializeDiskExit;

    }

    //
    // Create our disk device
    //
    ntStatus = IoCreateDevice(DriverObject,
                            sizeof(IDE_DEV_EXT),
                            &unicodeString,
                            FILE_DEVICE_DISK,
                            0,
                            FALSE,
                            &deviceObject);

    //
    // Again, we're done with the UNICODE string no matter the success
    // of IoCreateDevice(), so free it now
    //
    RtlFreeUnicodeString(&unicodeString);

    //
    // Check on the success of IoCreateDevice()
    //
    if (!NT_SUCCESS(ntStatus))  {

        DbgPrint("InitializeDisk: Couldn't create the device object - status %x\n",
                                    ntStatus);

        goto InitializeDiskExit;
    }

    //
    // Initialize partition 0 device object and extension data.  Store pointer
    // to controller extension in partition 0's extension.
    //
    deviceObject->Flags |= DO_DIRECT_IO;
    deviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT;

    devExt = (PIDE_DEV_EXT)(deviceObject->DeviceExtension);

    devExt->DiskNumber = *ConfigData->HardDiskCount;
    devExt->ControllerData = ControllerData;
    devExt->Partition0 = devExt;
    devExt->DeviceObject = deviceObject;
    devExt->DirectoryHandle = handle;
    devExt->PacketIsBeingRetried = FALSE;

    //
    // Set the device unit.  We must examine DiskNum for the case
    // where the controller says this is drive 2, but we were unable to
    // initialize the first drive.
    //
    devExt->DeviceUnit = DRIVE_1;

    //
    // Fill in device-specific numbers from IdeGetDataConfig
    //
    devExt->PretendNumberOfCylinders = ConfigData->Disk.PretendNumberOfCylinders;
    devExt->PretendTracksPerCylinder = ConfigData->Disk.PretendTracksPerCylinder;
    devExt->PretendSectorsPerTrack = ConfigData->Disk.PretendSectorsPerTrack;
    devExt->NumberOfCylinders = ConfigData->Disk.NumberOfCylinders;
    devExt->TracksPerCylinder = ConfigData->Disk.TracksPerCylinder;
    devExt->SectorsPerTrack = ConfigData->Disk.SectorsPerTrack;
    devExt->BytesPerSector = ConfigData->Disk.BytesPerSector;
    devExt->BytesPerInterrupt = ConfigData->Disk.BytesPerInterrupt;
    devExt->WritePrecomp = ConfigData->Disk.WritePrecomp;
    devExt->ReadCommand = ConfigData->Disk.ReadCommand;
    devExt->WriteCommand = ConfigData->Disk.WriteCommand;
    devExt->VerifyCommand = ConfigData->Disk.VerifyCommand;


    DbgPrint(
        "InitializeDisk: Geometry:\n"
        "        Appa Cyl: %x\n"
        "        Appa Hea: %x\n"
        "        Appa Sec: %x\n"
        "             Cyl: %x\n"
        "             Hea: %x\n"
        "             Sec: %x\n",
        devExt->PretendNumberOfCylinders,
        devExt->PretendTracksPerCylinder,
        devExt->PretendSectorsPerTrack,
        devExt->NumberOfCylinders,
        devExt->TracksPerCylinder,
        devExt->SectorsPerTrack);

    //
    // Determine the size of partition 0 (the whole disk).
    //

    devExt->Pi.StartingOffset.QuadPart = 0;

    devExt->Pi.PartitionLength.QuadPart =
            (UInt32x32To64(devExt->SectorsPerTrack, devExt->BytesPerSector) *
                            devExt->NumberOfCylinders) *
                                        devExt->TracksPerCylinder;

    ASSERT(devExt->BytesPerSector == 512);

    //
    // Byte to sector number conversion
    //
    devExt->ByteShiftToSector = 9;

    //
    // Initialize DPC 
    //
    IoInitializeDpcRequest(deviceObject, IdeDPC);

    //
    // Give the controller some time to settle down after reset.
    //
    IdeWaitControllerReady(ControllerData, 20, 150000);

    //
    // First we'll set up the disk so that it doesn't revert to power
    // on defaults after a controller reset.  Then we'll set it up
    // so that the write cache is disabled. 
    //
    ControllerData->DeviceObject = devExt->DeviceObject;

    //
    // Select the right drive.
    //
    WRITE_PORT_UCHAR(ControllerData->ControllerAddress + DRIVE_HEAD_REGISTER,
                    devExt->DeviceUnit);
    //
    // Disable the reverting to power on.
    //
    WRITE_PORT_UCHAR(ControllerData->ControllerAddress + WRITE_PRECOMP_REGISTER,
                                        0x66);

    WRITE_PORT_UCHAR(ControllerData->ControllerAddress + COMMAND_REGISTER,
                                        0xef);

    //
    // wait for the controller to catch its breath
    //
    IdeWaitControllerReady(ControllerData, 10, 15000);

    WRITE_PORT_UCHAR(ControllerData->ControllerAddress + DRIVE_HEAD_REGISTER,
                                    devExt->DeviceUnit);

    //
    // Set the drive parameters.  Note that this will generate an
    // interrupt, but we don't have to worry about it.
    //
    ControllerData->DeviceObject = devExt->DeviceObject;

    WRITE_PORT_UCHAR( ControllerData->ControllerAddress + DRIVE_HEAD_REGISTER,
        (UCHAR)(devExt->DeviceUnit | (devExt->TracksPerCylinder - 1)));

    WRITE_PORT_UCHAR(ControllerData->ControllerAddress + SECTOR_COUNT_REGISTER,
                (UCHAR)(devExt->SectorsPerTrack));

    WRITE_PORT_UCHAR(ControllerData->ControllerAddress + COMMAND_REGISTER,
                SET_DRIVE_PARAMETERS_COMMAND);

    //
    // Wait for the controller to be ready before we read the table
    //
    IdeWaitControllerReady(ControllerData, 20, 150000);

    //
    // Now recalibrate the drive.
    //
    ControllerData->DeviceObject = devExt->DeviceObject;


    WRITE_PORT_UCHAR(ControllerData->ControllerAddress + DRIVE_HEAD_REGISTER,
                (UCHAR)(devExt->DeviceUnit | (devExt->TracksPerCylinder - 1)));

    WRITE_PORT_UCHAR(ControllerData->ControllerAddress + COMMAND_REGISTER,
                 RECALIBRATE_COMMAND);

    //
    // wait for things to settle down
    //
    IdeWaitControllerReady(ControllerData, 20, 150000);

    //

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久久蜜桃| 成人网在线免费视频| 欧美性受极品xxxx喷水| 亚洲免费观看高清完整版在线 | 免费视频最近日韩| 91精品国产色综合久久久蜜香臀| 亚洲国产cao| 日韩免费视频线观看| 国产一区二区调教| 中文字幕在线观看不卡| 色婷婷久久久综合中文字幕| 亚洲综合免费观看高清在线观看| 欧美老肥妇做.爰bbww| 全国精品久久少妇| 国产欧美一区二区精品性色超碰| hitomi一区二区三区精品| 亚洲老妇xxxxxx| 91精品国产乱| 成人午夜av电影| 视频一区视频二区中文| 国产视频一区在线观看| 色偷偷久久一区二区三区| 丝袜亚洲另类丝袜在线| 久久精品免费在线观看| 欧美自拍丝袜亚洲| 国产综合色精品一区二区三区| 中文字幕欧美一区| 678五月天丁香亚洲综合网| 国产v日产∨综合v精品视频| 亚洲毛片av在线| 欧美videofree性高清杂交| 不卡av在线免费观看| 舔着乳尖日韩一区| 国产精品入口麻豆原神| 日韩一区二区三区观看| 91在线免费播放| 韩国av一区二区三区| 亚洲午夜激情网站| 国产欧美一区二区精品性色| 欧洲视频一区二区| 高清不卡在线观看av| 日本欧美一区二区在线观看| 国产精品成人免费在线| 精品国产91乱码一区二区三区| 9l国产精品久久久久麻豆| 久久精品免费看| 亚洲一级二级在线| 中文字幕在线不卡一区二区三区| 日韩欧美高清一区| 在线播放中文字幕一区| 一本大道综合伊人精品热热| 国产精品69久久久久水密桃 | 天堂在线一区二区| 亚洲天堂2016| 欧美极品xxx| 久久亚洲一区二区三区四区| 欧美精品少妇一区二区三区| 91蝌蚪国产九色| 成人av午夜影院| 国产福利一区二区| 国产裸体歌舞团一区二区| 男男视频亚洲欧美| 午夜精品久久久久久久99水蜜桃 | 国产一区二区伦理片| 婷婷中文字幕综合| 亚洲一级电影视频| 亚洲欧美一区二区久久| 国产精品福利电影一区二区三区四区| 2021久久国产精品不只是精品| 欧美一区二区三区在线视频| 欧美日韩精品综合在线| 欧美日产在线观看| 欧美日韩成人在线一区| 欧美系列在线观看| 精品视频在线免费看| 91浏览器在线视频| 欧美亚洲国产bt| 欧美日韩精品一区二区| 欧美日韩精品综合在线| 91精品国产91久久久久久最新毛片 | 久久久噜噜噜久噜久久综合| www久久精品| 久久久久国产一区二区三区四区| 久久久综合精品| 久久人人爽人人爽| 国产精品天天摸av网| 亚洲人成人一区二区在线观看 | 日韩一区二区免费电影| 日韩丝袜美女视频| 精品福利二区三区| 欧美极品xxx| 亚洲精品成人悠悠色影视| 亚洲自拍欧美精品| 日韩精品1区2区3区| 极品少妇xxxx精品少妇偷拍| 国产一区二区三区观看| 成人h动漫精品| 欧美专区日韩专区| 日韩欧美亚洲另类制服综合在线| 精品少妇一区二区三区在线播放| 国产日韩视频一区二区三区| 国产精品传媒在线| 日韩精品一二三四| 国产成人av一区二区| 一本久久a久久免费精品不卡| 欧美电影一区二区三区| 精品国产乱码久久| 亚洲欧美综合另类在线卡通| 五月综合激情网| 国产精品性做久久久久久| 91国内精品野花午夜精品| 日韩精品最新网址| 亚洲精品午夜久久久| 蜜桃91丨九色丨蝌蚪91桃色| 成人高清视频在线观看| 欧美剧情片在线观看| 国产亚洲欧美日韩日本| 亚洲第一综合色| 粉嫩av一区二区三区在线播放| 欧美综合亚洲图片综合区| 亚洲精品在线三区| 亚洲精品免费播放| 国产精品一区二区免费不卡| 欧美三级视频在线观看 | 日韩一区日韩二区| 日本美女视频一区二区| 99riav一区二区三区| 精品奇米国产一区二区三区| 亚洲欧美另类久久久精品2019| 蜜臀av性久久久久蜜臀aⅴ| 91视频在线观看免费| 精品sm在线观看| 婷婷久久综合九色综合绿巨人| www.亚洲人| 久久丝袜美腿综合| 日韩精品一区第一页| 日本高清免费不卡视频| 亚洲国产成人私人影院tom | 国内久久精品视频| 在线不卡中文字幕| 一区二区在线免费观看| 国产不卡视频在线播放| www一区二区| 另类小说综合欧美亚洲| 欧美性感一区二区三区| 中文字幕一区二区三中文字幕| 国产乱人伦偷精品视频不卡| 日韩精品一区二区三区四区视频| 亚洲图片欧美一区| 欧美在线免费播放| 亚洲女女做受ⅹxx高潮| 成a人片国产精品| 久久久99精品免费观看| 激情图片小说一区| 欧美大片一区二区三区| 日本欧美在线看| 欧美一区二区三区精品| 日韩二区三区在线观看| 欧美日韩一二区| 亚洲午夜一区二区| 91久久久免费一区二区| 亚洲精品一二三四区| 日本高清视频一区二区| 一区二区三区在线不卡| 色呦呦网站一区| 一区二区三区在线免费视频| 91福利区一区二区三区| 伊人婷婷欧美激情| 精品视频1区2区3区| 亚洲午夜一区二区三区| 欧美男同性恋视频网站| 日本网站在线观看一区二区三区| 69堂精品视频| 国产自产v一区二区三区c| 26uuu成人网一区二区三区| 国产成人av一区二区三区在线 | 国产精品初高中害羞小美女文| 成人国产精品免费观看| 亚洲理论在线观看| 在线综合视频播放| 国模冰冰炮一区二区| 国产精品美女久久久久久2018| 成人久久久精品乱码一区二区三区| 国产精品国产三级国产普通话蜜臀 | 午夜精品视频一区| 欧美一区二区三级| 国产成人亚洲精品青草天美| 成人欧美一区二区三区| 欧美日韩精品综合在线| 老色鬼精品视频在线观看播放| 精品日韩av一区二区| 国产·精品毛片| 夜夜精品视频一区二区| 91精品国产全国免费观看| 国产激情一区二区三区四区 | 8x福利精品第一导航| 国产一区二区三区免费在线观看| 久久精品一区二区三区四区| 91麻豆蜜桃一区二区三区| 日日摸夜夜添夜夜添精品视频|