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

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

?? ide.c

?? 硬盤驅動的例子
?? C
?? 第 1 頁 / 共 4 頁
字號:
///////////////////////////////////////////////////////////////////////////////
//
//  (C) Copyright 1995 - 1998 OSR Open Systems Resources, Inc.
//	All Rights Reserved
//      Based on a previous work by Microsoft Corporation
//      Copyright (c) 1991, 1992, 1993  Microsoft Corporation
//
//    This sofware is supplied for instructional purposes only.
//
//      OSR Open Systems Resources, Inc. (OSR) expressly disclaims any warranty
//      for this software.  THIS SOFTWARE IS PROVIDED  "AS IS" WITHOUT WARRANTY
//      OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,
//      THE IMPLIED WARRANTIES OF MECHANTABILITY OR FITNESS FOR A PARTICULAR
//      PURPOSE.  THE ENTIRE RISK ARISING FROM THE USE OF THIS SOFTWARE REMAINS
//      WITH YOU.  OSR's entire liability and your exclusive remedy shall not
//      exceed the price paid for this material.  In no event shall OSR or its
//      suppliers be liable for any damages whatsoever (including, without
//      limitation, damages for loss of business profit, business interruption,
//      loss of business information, or any other pecuniary loss) arising out
//      of the use or inability to use this software, even if OSR has been
//      advised of the possibility of such damages.  Because some states/
//      jurisdictions do not allow the exclusion or limitation of liability for
//      consequential or incidental damages, the above limitation may not apply
//      to you.
//
//    This driver is the example Programmed I/O device driver that
//    accompanies the book Windows NT Device Driver Development, by
//    Peter Viscarola and W. Anthony Mason, (c) 1998 OSR Open Systems
//    Resources, Inc. and published by MacMillan Technical Publishing
//    ISBN 1578700582.  
//
//
//  OSR Open Systems Resources, Inc.
//  105 Route 101A Suite 19
//  Amherst, NH 03031  (603) 595-6500 FAX: (603) 595-6503
//  email bugs to: bugs@osr.com
//
//
//  MODULE:
//
//      $Workfile: ide.c $
//
//  ABSTRACT:
//
//      This file contains the initial entry point for the OSR Sample
//      Programmed I/O device driver for the IDE (AT) Disk Controller.
//
//  AUTHOR:
//
//      Open Systems Resources, Inc.
// 
//  REVISION:   
//
//
///////////////////////////////////////////////////////////////////////////////

#include "ntddk.h"                      // main NT include
#include "ntdddisk.h"                   // disk driver IOCTL definitions
#include "ntddscsi.h"                   // scsi IOCTL defintions
#include "hw.h"                         // the access macro/definitions
#include "ide.h"                        // general declarations/structures
#include "utils.h"                      // IdeWaitController utilities

//
// static forward declarations
//


static VOID
FinishIrp(IN PIDE_DEV_EXT devExt,
          IN NTSTATUS NtStatus);

static BOOLEAN
ResetDisk(IN PVOID Context);


///////////////////////////////////////////////////////////////////////////////
//
//  IdeDispatchCreateClose
//
//    This routine handles the Create and Close IRPs.  Since we're a 
//    disk driver, this only completes the IRP
//
//  INPUTS:
//
//    DeviceObject      - pointer to our device object
//    Irp               - pointer to the IRP
//
//  OUTPUTS:
//  
//    None.
//
//  RETURNS:
//
//    STATUS_SUCCESS, any time, all the time
//
//      IRQL:
//
//    IRQL_PASSIVE_LEVEL
//
//  NOTES:
//
///////////////////////////////////////////////////////////////////////////////
NTSTATUS
IdeDispatchCreateClose(IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp)
{

    //
    // Nothing to do... Just complete the request with success and return
    //

    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;

    //
    // Complete the irp with no increase in priority 
    //

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    //
    // return the success
    //

    return STATUS_SUCCESS;
}



///////////////////////////////////////////////////////////////////////////////
//
//  IdeDispatchDeviceControl
//
//    This routine handles the device control IRPs
//
//  INPUTS:
//
//    DeviceObject      - pointer to our device object
//    Irp               - pointer to the IRP
//
//  OUTPUTS:
//  
//    None.
//
//  RETURNS:
//
//    STATUS_SUCCESS upon completion of the request, otherwise
//    STATUS_INVALID_DEVICE_REQUEST , STATUS_INVALID_PARAMETER
//
//      IRQL:
//
//    IRQL_PASSIVE_LEVEL
//
//  NOTES:
//
///////////////////////////////////////////////////////////////////////////////
NTSTATUS
IdeDispatchDeviceControl(IN PDEVICE_OBJECT DeviceObject,
                        IN OUT PIRP Irp)
{
    PPARTITION_DATA partitionData;
    PIDE_DEV_EXT devExt;
    PCONTROLLER_DATA controllerData;
    PIO_STACK_LOCATION ioStack;
    NTSTATUS ntStatus;

    //
    // Set up some locals
    //
    partitionData = DeviceObject->DeviceExtension;
    devExt = partitionData->Partition0;
    controllerData = devExt->ControllerData;




        //
    // Get the current stack location
    //
    ioStack = IoGetCurrentIrpStackLocation(Irp);

    //
    // Determine which I/O control code was specified.  
    // In this sample driver, we support the absolute minimum IOCTL
    // necessar.  See NTDDDISK.H for the complete set of definitions.
    //
    switch (ioStack->Parameters.DeviceIoControl.IoControlCode) {

        //
        // Return the drive geometry
        //
        case IOCTL_DISK_GET_DRIVE_GEOMETRY: 

            //
            // Validate the size of the requestor's buffer
            //
            if (ioStack->Parameters.DeviceIoControl.OutputBufferLength <
                    sizeof(DISK_GEOMETRY)) {

            Irp->IoStatus.Information = 0;
            Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;

            } else {

                PDISK_GEOMETRY obuf;

                //
                // Since the IOCTL is specified as METHOD_BUFFERED, the
                // output buffer is in system pool, pointed to by the
                // AssociatedIrp.SystemBuffer field in the IRP
                //
                obuf = (PDISK_GEOMETRY)Irp->AssociatedIrp.SystemBuffer;

                //
                // This is known to be a fixed hard disk, so we return
                // FixedMedia (defined in NTDDDISK.H)
                //
                obuf->MediaType = FixedMedia;

                //
                // The actual disk geometry is retrieved from the 
                // devExt structure.  This was filled in during 
                // device initialization (see InitializeDisk())
                //
                obuf->Cylinders.QuadPart = devExt->PretendNumberOfCylinders;
                obuf->TracksPerCylinder = devExt->PretendTracksPerCylinder;
                obuf->SectorsPerTrack = devExt->PretendSectorsPerTrack;
                obuf->BytesPerSector = devExt->BytesPerSector; 

                //
                // Fill in the I/O Status Block for completion
                //
                Irp->IoStatus.Information = sizeof(DISK_GEOMETRY);

                Irp->IoStatus.Status = STATUS_SUCCESS;

            }

            break ;

        //
        // Return the information about the partition specified by the
        // device object.
        //
        case IOCTL_DISK_GET_PARTITION_INFO: 

            //
            // Validate the size of the requestor's buffer
            //
            if (ioStack->Parameters.DeviceIoControl.OutputBufferLength <
                    sizeof(PARTITION_INFORMATION)) {

                Irp->IoStatus.Information = 0;
                Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;

            } else {


                //
                // Is this request for the physical device (i.e. Partition0)?
                //
                if (partitionData == (PPARTITION_DATA)devExt) {

                    //
                    // The request is for the physical device.  This isn't
                    // a sensible request... so fail it.
                    //
                    Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;

                } else {

                    PPARTITION_INFORMATION obuf;

                    //
                    // The request is for an actual partition on the drive,
                    // not the physical device.

                    //
                    // Since this IOCTL uses METHOD_BUFFERED, we locate
                    // the intermediate buffer to be used to return data to
                    // the requestor in AssociatedIrp.SystemBuffer
                    //
                    obuf = (PPARTITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;

                    //
                    // Fill in the partition information obtained during
                    // the initilaization process (see InitalizeDisk()
                    //
                    obuf->PartitionType = partitionData->Pi.PartitionType;
                    obuf->BootIndicator = partitionData->Pi.BootIndicator;

                    //
                    // If it wasn't regcognized, we wouldn't have a partition
                    // device object...
                    //
                    obuf->RecognizedPartition = TRUE;

                    obuf->RewritePartition = FALSE;
                    obuf->PartitionNumber = partitionData->Pi.PartitionNumber;
                    obuf->StartingOffset = partitionData->Pi.StartingOffset;
                    obuf->PartitionLength = partitionData->Pi.PartitionLength;
                    obuf->HiddenSectors = partitionData->Pi.HiddenSectors;

                    //
                    // Set the length of the returned data in the Information
                    // field and set the STATUS_SUCCESS for the Irp
                    //
                    Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION);

                    Irp->IoStatus.Status = STATUS_SUCCESS;
                }

            }

            break ;

        //
        // Set some partition information
        //
        case IOCTL_DISK_SET_PARTITION_INFO:

            //
            // Validate the input buffer size.  If it's not correct,
            // complete the IRP with an error status.
            //
            if (ioStack->Parameters.DeviceIoControl.InputBufferLength <
                    sizeof(SET_PARTITION_INFORMATION)) {

                Irp->IoStatus.Information = 0;
                Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;

            } else {


                //
                // Is the requestor trying to set partition info for
                // Partion zero, which is the physical disk?
                //
                if (partitionData == (PPARTITION_DATA)devExt) {

                    //
                    // Can't set the part info on a physical disk, silly!
                    //
                    Irp->IoStatus.Information = 0;
                    Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;

                } else {

                    PSET_PARTITION_INFORMATION inputBuffer;

                    //
                    // Since the IOCTL uses METHOD_BUFFERED, we locate
                    // the intermediate buffer with the requestor's set
                    // partition information in it.
                    //
                    inputBuffer =
                            (PSET_PARTITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;

                    //
                    // Invoke the kernel function to set the partition information
                    //

                    //
                    // If this were a REAL IDE driver, we might want to VALIDATE
                    // the partition information being set before lofting this
                    // request down to the I/O Manager.  But seeing as how
                    // this is just a sample...
                    //
                    ntStatus = IoSetPartitionInformation(devExt->DeviceObject,
                            devExt->BytesPerSector,
                            partitionData->PartitionOrdinal,
                            inputBuffer->PartitionType);

                    //
                    // Update our information
                    //
                    if (NT_SUCCESS(ntStatus)) {

                        partitionData->Pi.PartitionType = inputBuffer->PartitionType;
                    }

                    //
                    // 
                    //
                    Irp->IoStatus.Status = ntStatus;
                    Irp->IoStatus.Information = 0;
                }

            }
            break ;

        //
        // Return the partition layout for the physical drive.  Note that
        // the layout is returned for the actual physical drive, regardless
        // of which partition was specified for the request.
        //
        case IOCTL_DISK_GET_DRIVE_LAYOUT: 

            //
            // Check that the input buffer is of the correct size.
            // If not, then return an error
            //
            if (ioStack->Parameters.DeviceIoControl.OutputBufferLength <
                    sizeof(DRIVE_LAYOUT_INFORMATION)) {

                Irp->IoStatus.Information = 0;
                Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;

            } else {

                PDRIVE_LAYOUT_INFORMATION partitionList;

                //
                // Call the service to read the partition table.  The
                // result will be stored in a "partition buffer" allocated
                // by the IoReadPartitionTable() function in non-paged
                // pool.  We free this memory below...
                //
                ntStatus = IoReadPartitionTable(devExt->DeviceObject,
                        devExt->BytesPerSector,
                        FALSE,
                        &partitionList);

                //
                // if the read fails, then set the status
                //
                if (!NT_SUCCESS(ntStatus)) {

                    Irp->IoStatus.Information = 0;

                    Irp->IoStatus.Status = ntStatus;

                } else {

                    ULONG tempSize;

                    //
                    // The disk layout has been returned in the partitionList
                    // buffer.
                    //
                    // First, we must determine the size of the returned
                    // information to see if the data will fit into the
                    // IOCTL buffer.   The DRIVE_LAYOUT_INFORMATION
                    // structure (defined in NTDDDISK.H) consists of a
                    // variable number of PARTITION_INFORMATION structures
                    // (also defined in NTDDDISK.H).  So, first we use the
                    // MACRO FIELD_OFFSET (defined in NTDEF.H) which
                    // will determine the size of the DRIVE_LAYOUT_INFORMATION
                    // structure less the start of the PARTITION_INFORMATION
                    // structures.
                    //
                    tempSize = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION,
                            PartitionEntry[0]);

                    //
                    // We now add to tempSize the size of all of the 
                    // PARTITION_INFORMATION structures
                    //
                    tempSize += partitionList->PartitionCount *
                            sizeof(PARTITION_INFORMATION);

                    //
                    // If this total size is larger than the requestor's
                    // OutputBufferLength, then return an error
                    //
                    if (tempSize >
                            ioStack->Parameters.DeviceIoControl.OutputBufferLength) {

                        Irp->IoStatus.Information = 0;

                        Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;

                    } else {

                        //
                        // The buffer is large enough, so move the data
                        //
                        RtlMoveMemory(Irp->AssociatedIrp.SystemBuffer,
                                partitionList,
                                tempSize);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲乱码精品一二三四区日韩在线| 日韩一区二区免费在线电影| 成人性生交大片免费看中文网站| 免费在线观看视频一区| 亚洲h动漫在线| 图片区日韩欧美亚洲| 亚洲自拍偷拍av| 亚洲bdsm女犯bdsm网站| 五月婷婷激情综合网| 日韩av一区二区三区四区| 美国十次综合导航| 国产精品一区在线观看你懂的| 国产精品一区免费视频| 99久久er热在这里只有精品66| 色综合天天综合色综合av| 欧美性xxxxx极品少妇| 亚洲精品在线观看网站| 国产精品嫩草影院com| 亚洲精品成人精品456| 麻豆精品视频在线观看| 成av人片一区二区| 日韩欧美国产小视频| 天天综合色天天| 午夜精品国产更新| 91香蕉视频黄| 亚洲精品一线二线三线| 亚洲二区视频在线| 成人性色生活片| 日韩欧美在线一区二区三区| 国产精品黄色在线观看| 久久精品噜噜噜成人88aⅴ| 91在线精品秘密一区二区| 2023国产精华国产精品| 午夜电影一区二区| 一本高清dvd不卡在线观看 | 制服视频三区第一页精品| 亚洲精品中文在线| 91亚洲永久精品| 中文字幕第一区二区| 国产精品1区二区.| 精品国产乱码久久久久久闺蜜| 日韩成人免费在线| 欧美日韩精品免费| 免费在线视频一区| 91麻豆精品久久久久蜜臀| 奇米精品一区二区三区四区 | 中文字幕在线一区免费| 成人黄色在线视频| 日韩美女视频一区| 欧美亚洲综合另类| 捆绑调教美女网站视频一区| 精品国产乱码久久久久久影片| 国产乱码精品一区二区三区av | 国产精品一区二区在线看| 国产亚洲美州欧州综合国| 亚洲欧美另类小说| 一本色道a无线码一区v| 日本在线播放一区二区三区| 国产三级欧美三级日产三级99| 国产成人aaa| 一个色综合网站| 欧美成人国产一区二区| av一区二区久久| 丝袜亚洲另类欧美综合| 国产精品久久久久久久第一福利 | 国产欧美日韩精品一区| 91精品福利在线| 狠狠久久亚洲欧美| 亚洲成人久久影院| 中日韩免费视频中文字幕| 欧美视频在线观看一区二区| 国产乱人伦偷精品视频免下载| 一卡二卡欧美日韩| 欧美国产乱子伦| 日韩欧美高清在线| 欧美日韩国产另类一区| 91日韩精品一区| 国产福利不卡视频| 国产精品一二二区| 国产在线视视频有精品| 亚洲成人手机在线| 亚洲成av人片在线| 亚洲欧美日韩一区| 亚洲欧美一区二区三区久本道91| 精品国产制服丝袜高跟| 日韩欧美成人午夜| 日韩欧美国产综合| 精品捆绑美女sm三区| 2020国产精品久久精品美国| 91精品麻豆日日躁夜夜躁| 欧美肥妇bbw| 精品成人一区二区三区四区| 欧美一区二区三区小说| 精品久久五月天| 在线亚洲免费视频| 国产在线一区二区综合免费视频| 久久精品国产亚洲高清剧情介绍| 美脚の诱脚舐め脚责91 | 制服丝袜激情欧洲亚洲| 日韩欧美一区电影| 国产精品国产成人国产三级| 中文字幕亚洲成人| 亚洲欧洲制服丝袜| 日韩精品福利网| 国产精品一区二区久激情瑜伽| 成人h精品动漫一区二区三区| 91日韩在线专区| 2022国产精品视频| 亚洲国产一二三| 国产**成人网毛片九色 | 天天av天天翘天天综合网色鬼国产 | 日本一区二区三区四区在线视频| 国产精品久久综合| 免费不卡在线视频| 日本高清不卡一区| 国产欧美一区二区在线观看| 亚洲成人一区在线| 在线看一区二区| 欧美国产视频在线| 狠狠网亚洲精品| 精品日韩一区二区三区免费视频| 亚洲视频免费观看| 91在线视频观看| 国产精品麻豆视频| 国产麻豆午夜三级精品| 欧美一区二区久久| 久久精品国产色蜜蜜麻豆| 欧美日韩精品电影| 天堂一区二区在线| 91精品国产91热久久久做人人| 一区二区三区免费网站| 色综合久久99| 亚洲精品久久7777| 日本成人超碰在线观看| 99vv1com这只有精品| 亚洲图片激情小说| 91日韩在线专区| 亚洲a一区二区| 欧美大度的电影原声| 国模娜娜一区二区三区| 中文字幕欧美国产| 色88888久久久久久影院按摩| 一个色综合网站| 日韩视频中午一区| 国产激情91久久精品导航| 国产亚洲欧美日韩在线一区| 国产mv日韩mv欧美| 亚洲免费三区一区二区| 欧美精品三级在线观看| 国产又黄又大久久| 亚洲免费伊人电影| 精品久久久久久久久久久久久久久久久 | 亚洲午夜激情网站| 精品久久久久久久一区二区蜜臀| 北条麻妃国产九九精品视频| 午夜久久久影院| 国产精品三级电影| 欧美精品色综合| 91蜜桃在线观看| 国产黄色精品视频| 蜜臀久久99精品久久久久宅男| 国产精品毛片久久久久久| 日韩免费一区二区| 欧美区一区二区三区| 波多野结衣中文字幕一区二区三区| 午夜av电影一区| 亚洲中国最大av网站| 国产精品久久久久久久久晋中 | 成人动漫视频在线| 久久成人精品无人区| 石原莉奈在线亚洲二区| 亚洲卡通动漫在线| 国产精品灌醉下药二区| 中文字幕欧美激情| 久久免费视频一区| 精品久久国产字幕高潮| 91精品一区二区三区久久久久久 | 欧美日韩激情一区二区三区| 99天天综合性| www.欧美.com| 欧洲国产伦久久久久久久| 色天天综合久久久久综合片| 色老头久久综合| 欧美自拍偷拍午夜视频| 日韩欧美国产一区二区在线播放| 欧美三级中文字幕在线观看| 欧美精品日韩精品| 日韩欧美国产麻豆| 精品第一国产综合精品aⅴ| 久久精品免视看| 亚洲丝袜自拍清纯另类| 亚洲一区二区精品3399| 秋霞午夜av一区二区三区| 激情五月播播久久久精品| 不卡的av中国片| 欧美日韩国产小视频在线观看| 精品欧美黑人一区二区三区| 国产精品视频第一区| 婷婷久久综合九色综合绿巨人| 国产一区视频网站|