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

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

?? main.c

?? dma驅動開發程序
?? C
字號:
/*++

Copyright (c) 1997-1998  Microsoft Corporation

Module Name:

    main.c

Abstract:

    This file contains a driver skeleton that demonstrates how to locate
    and set up a PCI device.

    Note that this driver assumes that only a single I/O will be completed
    per interrupt.  If the hardware will support overlapped, concurrent I/O
    operations, the driver will have to be redesigned.

Author:

    Steve Dziok (SteveDz)

Environment:

    Kernel mode

Revision History:


--*/


#include "pcidma.h"

#ifdef DBG

#define DEBUG_BUFFER_SIZE   512

ULONG DebugPrintLevel = 0;
UCHAR DebugBuffer[DEBUG_BUFFER_SIZE];


#endif

//
// Make sure the initialization code is removed from memory after use.
//

#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#endif


NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
/*++

Routine Description:

    Determine if a PCI device exists, setup relevant structures, 
    claim resources, connect interrupts, and report status back to
    the system.  Most of the work done is in routines called by
    DriverEntry.
    
Arguments:

    DriverObject - Pointer to the driver object created by the I/O manager.
    
    RegistryPath - Pointer to the driver specific key 
                   \Registry
                      \Machine
                         \System
                            \CurrentControlSet
                               \Services
                                  \<DriverName>
    
Return Value:

    NTSTATUS
    
--*/
{
    PPCI_DEVICE_LOCATION    pciDeviceInfo;
    PPCI_DEVICE_LIST        pciDeviceList;

    NTSTATUS                status = STATUS_SUCCESS;

    USHORT                  deviceNumber;

    BOOLEAN                 foundOne = FALSE;


    DebugPrint((0, "DriverEntry routine\n"));
    DebugPrint((3, "DriverObject 0x%x \n", DriverObject));
    
    //
    // Set up the device driver entry points.
    //

    DriverObject->MajorFunction[IRP_MJ_READ] = PciDmaReadWrite;
    DriverObject->MajorFunction[IRP_MJ_WRITE] = PciDmaReadWrite;

    DriverObject->DriverStartIo = PciDmaStartIo;

    DriverObject->DriverUnload = PciDmaUnload;

    DriverObject->MajorFunction[IRP_MJ_CREATE] = PciDmaCreateClose;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = PciDmaCreateClose;

    //
    // Allocate storage for the list of PCI devices.
    //

    pciDeviceList = (PPCI_DEVICE_LIST)
                        ExAllocatePoolWithTag(NonPagedPool,
                                              MAX_PCIDEVICELIST_ENTRIES * sizeof(PCI_DEVICE_LIST),
                                              EX_POOL_TAG_VALUE
                                              );

    if (!pciDeviceList) {

        DebugPrint((1, "Unable to allocate storage for pciDeviceList \n"));

        return STATUS_INSUFFICIENT_RESOURCES;
    }

    //
    // Find all the specified PCI devices.
    //

    status = FindPciDevice(PCI_VENDOR_ID,
                           PCI_DEVICE_ID,
                           pciDeviceList
                           );

    if (!NT_SUCCESS(status)) {

        DebugPrint((2, "Error locating PCI device.  Status = %x \n",
                    status
                    ));

        ExFreePool(pciDeviceList);

        return status;
    }

    //
    // Set up each of the located PCI devices.
    //

    for ( deviceNumber = 0;
          deviceNumber < pciDeviceList->Count && deviceNumber < MAXIMUM_DEVICES_SUPPORTED;
          deviceNumber++ ) {

        //
        // Get current PCI device location.
        //

        pciDeviceInfo = &pciDeviceList->List[deviceNumber];

        status = SetupPciDevice(DriverObject,
                                RegistryPath,
                                pciDeviceInfo->BusNumber,
                                pciDeviceInfo->SlotNumber.u.AsULONG,
                                deviceNumber
                                );

        //
        // Save the fact that one or more devices were found and configured.
        //

        if (NT_SUCCESS(status)) {

            foundOne = TRUE;
        }

    }

    //
    // Free the temporary storage.
    //

    if (pciDeviceList) {
        ExFreePool(pciDeviceList);
    }

    //
    // If at least one device found, indicate this fact.  If no devices
    // found, return this fact and the system will unload this driver.
    //
    
    if (foundOne) {
        return STATUS_SUCCESS;
    } else {
        return STATUS_NO_SUCH_DEVICE;
    }

}   // DriverEntry




NTSTATUS
PciDmaCreateClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++

Routine Description:
    
    Create (open) or Close the device.  This routine doesn't do
    anything except complete the IRP.
    
Arguments:

    DeviceObject - Object representing a particular adapter.
    
    Irp - IRP_MJ_CREATE or IRP_MJ_CLOSE I/O request.
    
Return Value:

    NTSTATUS
    
--*/
{
    DebugPrint((3, "PciDmaCreateClose \n"));

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

    IoCompleteRequest (Irp, IO_NO_INCREMENT);

    return STATUS_SUCCESS;

}   // PciDmaCreateClose



VOID
PciDmaUnload(
    IN PDRIVER_OBJECT DriverObject
    )
/*++

Routine Description:

    Prepare the driver for unload.  For all the device objects created
    for this driver, loop through each one, disconnect interrupts, unmap
    memory and I/O spaces, free memory, etc.
    
Arguments:

    DriverObject - Pointer to the driver object created by the I/O manager.
    
Return Value:

    None
    
--*/
{
    PDEVICE_OBJECT      deviceObject = DriverObject->DeviceObject;
    PDEVICE_OBJECT      nextDevice;

    DebugPrint((3, "PciDmaUnload \n"));

    //
    // For each device object, clean up the device interaction with
    // the system.
    //
    
    while (deviceObject) {

        DebugPrint((2, "Removing DeviceObject at %x \n",
                    deviceObject
                    ));

        //
        // Save a pointer to the next device, if any.
        //

        nextDevice = deviceObject->NextDevice;

        //
        // Free device resources and delete the device.
        //

        FreeDeviceResources(DriverObject,
                            deviceObject
                            );

        //
        // Continue with the next device object.
        //

        deviceObject = nextDevice;
    }

}   // PciDmaUnload



NTSTATUS
PciDmaReadWrite(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++

Routine Description:

    Handle the Read or Write request.  This driver was designed to
    process more than one IRP into the driver, but only one IRP is active
    on the adapter at any one time.  In other words, several I/Os will be
    queued at the top level, but only one I/O will ever be processed on the 
    adapter at any instant in time.  The driver will have to be modified if 
    the adapter can handle more than one active IRP.
    
Arguments:

    DeviceObject - Object representing a particular adapter.
    
    Irp - IRP_MJ_READ or IRP_MJ_WRITE I/O request.
    
Return Value:

    NTSTATUS
    
--*/
{
    PIO_STACK_LOCATION  irpStack = IoGetCurrentIrpStackLocation(Irp);
    
    PDEVICE_EXTENSION   deviceExtension = DeviceObject->DeviceExtension;
    
    ULONG   transferPages;
    ULONG   transferByteCount = irpStack->Parameters.Read.Length;    
    
    //
    // Insure that the IRP information is correct.  If it is not,
    // complete the IRP with the proper error status.
    //

    if (0 == transferByteCount) {
        
        DebugPrint((2, "Zero transfer length input to read/write \n"));
        
        Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
        Irp->IoStatus.Information = 0;
        
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        
        return STATUS_INVALID_PARAMETER;
    }
    
    //
    // Calculate number of pages in this transfer.
    //

    transferPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(Irp->MdlAddress),
                                                   irpStack->Parameters.Read.Length
                                                   );
    
    //
    // Check if request length is greater than the maximum number of
    // bytes that the hardware can transfer.  Either split the request 
    // into multiple requests or fail the original request.  This driver 
    // will fail requests if it is too large.
    //

    if (transferByteCount > deviceExtension->MaximumTransferLength ||
        transferPages > deviceExtension->MaximumPhysicalPages) {
    
        DebugPrint((2, "Requested transfer larger than device capabilities \n"));
        
        Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
        Irp->IoStatus.Information = 0;    
    
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        
        return STATUS_INVALID_PARAMETER;
    }

    //
    // Add a check for data alignment if this is a device restriction.
    //
        
    //
    // Mark IRP as pending.
    //

    IoMarkIrpPending(Irp);

    //
    // Start the I/O request.
    //

    IoStartPacket(DeviceObject,
                  Irp,
                  NULL,
                  NULL
                  );

    return STATUS_PENDING;


}   // PciDmaReadWrite



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩综合色| 亚洲激情五月婷婷| av一区二区久久| 久久精品国产澳门| 亚洲午夜电影网| 亚洲综合无码一区二区| 国产精品蜜臀在线观看| 久久久久国产成人精品亚洲午夜| 88在线观看91蜜桃国自产| 欧美色综合网站| 91精品国产综合久久精品| 欧美一区二区三区在线观看| 日韩一区二区三区高清免费看看 | 99国产一区二区三精品乱码| 懂色av中文一区二区三区| 福利一区二区在线| 91婷婷韩国欧美一区二区| av在线一区二区| 在线观看三级视频欧美| 在线成人午夜影院| 日韩无一区二区| 久久久精品国产99久久精品芒果| 国产视频一区在线播放| 国产精品久久久久久久久动漫| 国产精品国产三级国产aⅴ中文| 亚洲精品欧美在线| 日韩专区一卡二卡| 国产精品99久久久久久久vr| 色综合久久88色综合天天6| 91精品中文字幕一区二区三区| 久久久精品免费免费| 亚洲欧美日韩综合aⅴ视频| 日韩精品亚洲专区| 精品亚洲aⅴ乱码一区二区三区| 日本不卡一二三区黄网| 国产精品一区二区久激情瑜伽| 99视频一区二区| 91麻豆精品国产91久久久久久久久| 欧美大片顶级少妇| 亚洲人午夜精品天堂一二香蕉| 久久久久久电影| 亚洲一本大道在线| 国产高清精品网站| 欧美日韩国产综合一区二区| 欧美韩国日本综合| 日韩国产精品久久久久久亚洲| 成人app软件下载大全免费| 欧美一卡2卡3卡4卡| 一级特黄大欧美久久久| 国产v日产∨综合v精品视频| 欧美肥妇毛茸茸| 一区二区三区在线看| 国产一区三区三区| 欧美日本视频在线| 亚洲精品菠萝久久久久久久| 国产精品白丝jk黑袜喷水| 欧美高清www午色夜在线视频| 综合欧美一区二区三区| 国产在线观看免费一区| 91麻豆精品国产综合久久久久久| 欧美日韩国产美| 日本一区二区三区国色天香| 美腿丝袜亚洲色图| 在线观看91精品国产入口| 欧美精品1区2区3区| 国产欧美日韩视频在线观看| 蜜臀久久99精品久久久画质超高清| 日本韩国视频一区二区| 专区另类欧美日韩| 成人av动漫在线| 亚洲国产精品ⅴa在线观看| 国产美女精品在线| 久久久久久久性| 国产在线观看免费一区| 精品不卡在线视频| 婷婷国产v国产偷v亚洲高清| 亚洲va国产va欧美va观看| 久久久一区二区三区| 日产精品久久久久久久性色| 欧美日韩三级一区二区| 午夜视频一区二区| 欧美精品电影在线播放| 午夜久久久久久久久久一区二区| 欧美视频在线播放| 午夜久久久久久电影| 欧美人伦禁忌dvd放荡欲情| 爽好多水快深点欧美视频| 91精品国产综合久久久久久久久久 | 久久久久久免费网| 午夜久久福利影院| 精品久久久久久久一区二区蜜臀| 久久9热精品视频| 久久免费国产精品| av在线播放不卡| 亚洲国产综合91精品麻豆| 91麻豆精品91久久久久久清纯| 久久99精品国产麻豆婷婷洗澡| 2023国产精品自拍| 不卡一区二区在线| 性欧美疯狂xxxxbbbb| 精品国产一区二区三区久久影院| 国产乱码一区二区三区| 4438x成人网最大色成网站| 国产一区二三区| 亚洲免费视频成人| 欧美日韩另类一区| 久久99热狠狠色一区二区| 国产精品家庭影院| 欧美一区二区在线播放| 国产精品一品视频| 亚洲一二三区视频在线观看| 2024国产精品视频| 欧美写真视频网站| 国产精品一区二区在线观看网站| ...xxx性欧美| 日韩免费看的电影| 94-欧美-setu| 久久国产精品色| 夜夜夜精品看看| 国产午夜精品久久| 在线观看91视频| 99久久国产免费看| 国产成人啪免费观看软件 | 亚洲精品视频一区二区| 日韩午夜激情av| 高清shemale亚洲人妖| 久久久久久久久久久久久久久99 | 中文字幕在线观看一区二区| 欧美日免费三级在线| 成人免费视频app| 日本成人在线一区| 一区二区中文视频| 日韩欧美精品在线视频| 欧洲精品在线观看| 国产尤物一区二区在线| 日韩精品成人一区二区三区| 亚洲日穴在线视频| 久久久久久麻豆| 久久亚洲精华国产精华液| 欧美一区二区三区人| 日本久久电影网| 色综合久久综合网欧美综合网 | 亚洲欧美综合另类在线卡通| 欧美久久久久久蜜桃| 在线观看www91| 欧洲一区在线电影| 99精品国产视频| 国产一区二区免费在线| 日本女人一区二区三区| 五月婷婷综合在线| 亚洲国产日韩一级| 亚洲成人动漫精品| 一区二区三区免费| 国产精品午夜春色av| 久久久av毛片精品| 国产性色一区二区| 中文字幕av免费专区久久| 国产精品久久久99| 国产精品美女久久久久aⅴ| 欧美国产丝袜视频| 亚洲欧美日韩国产中文在线| 亚洲精品乱码久久久久久久久| 亚洲欧美日韩国产一区二区三区| 亚洲同性gay激情无套| 亚洲精品国久久99热| 亚洲国产欧美另类丝袜| 奇米影视一区二区三区| 看电影不卡的网站| 国产一区免费电影| 不卡的av电影| 欧美三片在线视频观看| 欧美一区二区视频在线观看2020 | 丁香婷婷综合五月| 97se亚洲国产综合在线| 欧美日韩免费高清一区色橹橹| 91精品国产综合久久小美女| 亚洲精品一区二区三区在线观看| 久久精品亚洲精品国产欧美kt∨| 国产精品乱码久久久久久| 亚洲午夜精品17c| 精久久久久久久久久久| 丰满亚洲少妇av| 在线中文字幕一区二区| 日韩一二在线观看| 亚洲同性gay激情无套| 日本女优在线视频一区二区| 懂色中文一区二区在线播放| 欧美三级蜜桃2在线观看| 久久综合九色综合97婷婷女人 | 成人黄页毛片网站| 欧美午夜片在线看| 久久久.com| 日韩影院在线观看| av在线一区二区| 精品成人a区在线观看| 亚洲一区影音先锋| 国产综合色精品一区二区三区| 色悠悠亚洲一区二区| 2023国产精品| 奇米影视在线99精品|