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

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

?? pcidma.h

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

Copyright (c) 1997-1998  Microsoft Corporation

Module Name:

    pcidma.h

Abstract:


Author:

    Steve Dziok (SteveDz)

Environment:

    Kernel mode

Revision History:


--*/

#include <ntddk.h>
#include "debug.h"
#include "driver.h"



#define MAX_PCIDEVICELIST_ENTRIES   100
#define MAX_PCI_BUSES               256

#define EX_POOL_TAG_VALUE           'icPz'

//
// The following #define is used to include only the code appropriate
// for this specific PCI device.
//
// If the PCI SCSI vendor specific code is to be included, uncomment 
// the following definition.  See the README.TXT file for warnings
// about including this code.  If the PCI SCSI vendor specific code
// is not to be included, remove (comment) the following definition.
//

#define VENDORID_1000_DEVICEID_0004     1

///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- START 
//
///////////////////////////////////////////////////////////////
#ifdef VENDORID_1000_DEVICEID_0004

#pragma message(" ")
#pragma message("*********************************************************************** ")
#pragma message("*                                                                     * ")
#pragma message("*  This sample driver is compiled for a specific PCI device:          * ")
#pragma message("*    VendorID 0x1000 DeviceID 0x0004 Symbios Logic 53c815 SCSI        * ")
#pragma message("*                                                                     * ")
#pragma message("*  If a different device is going to be supported, the vendor-unique  * ")
#pragma message("*  information in the driver must be updated and the driver rebuilt.  * ")
#pragma message("*                                                                     * ")
#pragma message("*  Search for VENDOR_UNIQUE in the source code.                       * ")
#pragma message("*                                                                     * ")
#pragma message("*********************************************************************** ")
#pragma message(" ")



//
// Change the PCI VendorId and DeviceId to match those
// of the PCI device this driver supports.
//

#define PCI_VENDOR_ID  0x1000
#define PCI_DEVICE_ID  0x0004


//
// Set the maximum number of devices this driver will support.
//

#define MAXIMUM_DEVICES_SUPPORTED   10

//
// Set the device specific information.
//

#define MAXIMUM_TRANSFER_LENGTH     64*1024
#define MAXIMUM_PHYSICAL_PAGES      16

#define SCATTER_GATHER_SUPPORT      TRUE

///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- END 
//
///////////////////////////////////////////////////////////////
#else

//
// Set up default values so the sample will compile.
//

#define PCI_VENDOR_ID  0x0000
#define PCI_DEVICE_ID  0x0000
#define MAXIMUM_DEVICES_SUPPORTED   1
#define MAXIMUM_TRANSFER_LENGTH     1024
#define MAXIMUM_PHYSICAL_PAGES      1
#define SCATTER_GATHER_SUPPORT      FALSE

#pragma message(" ")
#pragma message("*********************************************************************** ")
#pragma message("*                                                                     * ")
#pragma message("*  This sample driver is compiled without the PCI SCSI vendor         * ")
#pragma message("*  code included.  Without modification, this sample doesn't do       * ")
#pragma message("*  much.                                                              * ")
#pragma message("*                                                                     * ")
#pragma message("*********************************************************************** ")
#pragma message(" ")

#endif


//
// Define various storage layouts.
//

typedef struct _REGISTER_BASE {

//
// Register offsets
//


///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- START 
//
///////////////////////////////////////////////////////////////
#ifdef VENDORID_1000_DEVICEID_0004
    
    //
    // This just shows how you can define different register sizes in 
    // the structure.  There is a mix of UCHARs, ULONGs, UCHAR arrays,
    // and ULONG arrays.  Layout this structure to best map the specific 
    // device registers.
    //
                            // offset
    UCHAR   REG_00;         // 00
    UCHAR   REG_01;         // 01
    UCHAR   REG_02;         // 02
    UCHAR   REG_03;         // 03
    ULONG   REG_04;         // 04-07
    ULONG   REG_08;         // 08-0b
    UCHAR   REG_0C;         // 0c
    UCHAR   REG_0D;         // 0d
    UCHAR   REG_0E;         // 0e
    UCHAR   REG_0F;         // 0f
    ULONG   REG_10;         // 10-13
    UCHAR   INT_STATUS;     // 14
    UCHAR   REG_15;         // 15
    UCHAR   REG_16;         // 16
    UCHAR   REG_17;         // 17
    ULONG   REG_ARRAY0[10]; // 18-3f
    UCHAR   INT_ENABLE0;    // 40
    UCHAR   INT_ENABLE1;    // 41
    UCHAR   INT_STAT0;      // 42
    UCHAR   INT_STAT1;      // 43
    UCHAR   REG_ARRAY1[5];  // 44-48
    UCHAR   TIMER1;         // 49
    
    //
    // And so on...
    //
    

///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- END 
//
///////////////////////////////////////////////////////////////
#else

    ULONG   Dummy;          // Define a dummy element until the vendor unique code
                            // is included.

#endif
    
} REGISTER_BASE, *PREGISTER_BASE;
    

typedef struct _SG_ENTRY {

    PHYSICAL_ADDRESS    LogicalAddress;     // Mapped physical address
    ULONG               Length;

} SG_ENTRY, *PSG_ENTRY;

typedef struct _DPC_CONTEXT {

    ULONG       DpcInfo1;       // Some really useful info for the DPC
    ULONG       DpcInfo2;       // This sample doesn't use this info.
    ULONG       DpcInfo3;

} DPC_CONTEXT, *PDPC_CONTEXT;


typedef struct _BASE_ADDRESS {

    PHYSICAL_ADDRESS RangeStart;    // Original device physical address
    ULONG   RangeLength;            // Length of I/O or memory range
    BOOLEAN RangeInMemory;          // Flag: unmapped range is I/O or memory range

    PVOID   MappedRangeStart;       // Mapped I/O or memory range
    BOOLEAN MappedRangeInMemory;    // Flag: mapped range is I/O or memory range

    BOOLEAN ResourceMapped;         // Flag: resource is mapped (i.e. MmMapIoSpace called)

} BASE_ADDRESS, *PBASE_ADDRESS;

typedef struct _TRANSFER_INFO {

    PIRP        Irp;                    // IRP that the transfer info describes
    PVOID       CurrentVA;              // Virtual address of this transfer
    ULONG       ByteCount;              // Current transfer length
    BOOLEAN     WriteToDevice;          // Flag indicating Write operation
    ULONG       NumberOfMapRegisters;   // Number of map registers for current operation
    PVOID       MapRegisterBase;        // Map register base of current operation
    
} TRANSFER_INFO, *PTRANSFER_INFO;


typedef struct _DEVICE_EXTENSION {

    PDEVICE_OBJECT      DeviceObject;           // Returned by IoCreateDevice
    UNICODE_STRING      RegistryPath;           // Registry path to service control key
    UNICODE_STRING      Win32UnicodeString;     // DosDevice name for user mode
    UNICODE_STRING      ClassUnicodeString;     // DeviceClass name for registry resources

    BOOLEAN             SymbolicLinkCreated;    // Flag: DosDevice name created

    ULONG               BusNumber;              // System bus number
    ULONG               SlotNumber;             // PCI slot number

    PADAPTER_OBJECT     AdapterObject;          // Returned by HalGetAdapter
    PVOID               MapRegisterBase;        // Passed into the AdapterControl routine

    BOOLEAN             ScatterGather;          // Flag: scatter/gather support
    INTERFACE_TYPE      InterfaceType;          // Bus type -- PCI, ISA, EISA, etc.
    ULONG               MaximumTransferLength;  // Maximum transfer length for adapter
    ULONG               MaximumPhysicalPages;   // Maximum number of breaks adapter
                                                // supports

    PKINTERRUPT         InterruptObject;        // Returned by IoConnectInterrupt
    ULONG               InterruptLevel;         // Unmapped system interrupt level
    ULONG               InterruptVector;        // Unmapped system interrupt vector
    KINTERRUPT_MODE     InterruptMode;          // LevelSensitive or Latched
    
    LONG                DeviceConfigured;       // Flag: indicate device ready to go
    
    ULONG               AddressCount;           // Number of I/O and memory resources

    BASE_ADDRESS        BaseAddress[PCI_TYPE0_ADDRESSES];   // PCI base address info

    PREGISTER_BASE      RegisterBase;           // This is vendor defined structure
    UCHAR               TimerPeriod;            // Vendor specific (sample uses this value)

    PDPC_CONTEXT        DpcContext;             // Info for DpcForIsr routine

    TRANSFER_INFO       TransferInfo[1];        // Array of transfer info

    PHYSICAL_ADDRESS    SGListPA;               // Physical address of scatter/gather list
    ULONG               SGListLength;           // Length of scatter/gather list    
    BOOLEAN             SGListCached;           // Flag indicating whether SG list cached
    PSG_ENTRY           SGList;                 // Scatter/gather list
    
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;


//
// Define structures used to locate the PCI device.
//

typedef struct _PCI_DEVICE_LOCATION {
    ULONG BusNumber;
    PCI_SLOT_NUMBER SlotNumber;
} PCI_DEVICE_LOCATION, *PPCI_DEVICE_LOCATION;


typedef struct _PCI_DEVICE_LIST {
    ULONG Count;
    PCI_DEVICE_LOCATION List[1];
} PCI_DEVICE_LIST, *PPCI_DEVICE_LIST;


///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Chose either memory mapped or I/O mapped
//
///////////////////////////////////////////////////////////////

//
// To use memory mapped registers, include the following #define.  
// To use I/O mapped registers, comment out the following #define.
//

#define USE_MEMORY_MAPPED_REGISTERS     1

#ifdef USE_MEMORY_MAPPED_REGISTERS

    //
    // Use memory mapped registers
    //

#define READ_UCHAR(RegXX)               \
    (READ_REGISTER_UCHAR(&(deviceExtension->RegisterBase)->RegXX))

#define READ_USHORT(RegXX)              \
    (READ_REGISTER_USHORT(&(deviceExtension->RegisterBase)->RegXX))

#define READ_ULONG(RegXX)               \
    (READ_REGISTER_ULONG(&(deviceExtension->RegisterBase)->RegXX))

#define WRITE_UCHAR(RegXX, ValueXX)     \
    (WRITE_REGISTER_UCHAR(&(deviceExtension->RegisterBase)->RegXX, ValueXX))

#define WRITE_USHORT(RegXX, ValueXX)    \
    (WRITE_REGISTER_USHORT(&(deviceExtension->RegisterBase)->RegXX, ValueXX))

#define WRITE_ULONG(RegXX, ValueXX)     \
    (WRITE_REGISTER_ULONG(&(deviceExtension->RegisterBase)->RegXX, ValueXX))


#else

    //
    // Use I/O mapped registers
    //


#define READ_UCHAR(RegXX)               \
    (READ_PORT_UCHAR(&(deviceExtension->RegisterBase)->RegXX))

#define READ_USHORT(RegXX)              \
    (READ_PORT_USHORT(&(deviceExtension->RegisterBase)->RegXX))

#define READ_ULONG(RegXX)               \
    (READ_PORT_ULONG(&(deviceExtension->RegisterBase)->RegXX))

#define WRITE_UCHAR(RegXX, ValueXX)     \
    (WRITE_PORT_UCHAR(&(deviceExtension->RegisterBase)->RegXX, ValueXX))

#define WRITE_USHORT(RegXX, ValueXX)    \
    (WRITE_PORT_USHORT(&(deviceExtension->RegisterBase)->RegXX, ValueXX))

#define WRITE_ULONG(RegXX, ValueXX)     \
    (WRITE_PORT_ULONG(&(deviceExtension->RegisterBase)->RegXX, ValueXX))


#endif

//
// Function prototypes
//

IO_ALLOCATION_ACTION
BuildScatterGatherList(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID MapRegisterBase,
    IN PVOID Context
    );

NTSTATUS
CreateDeviceObject(
    IN PDRIVER_OBJECT       DriverObject,
    IN PUNICODE_STRING      RegistryPath,
    IN ULONG                BusNumber,
    IN ULONG                SlotNumber,
    IN USHORT               DeviceNumber,
    OUT PDEVICE_OBJECT      *DeviceObject
    );

VOID
DebugPrintRoutine(
    ULONG PrintLevel,
    PCCHAR DebugMessage,
    ...
    );

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

NTSTATUS
FindPciDevice(
    IN USHORT VendorId,
    IN USHORT DeviceId,
    OUT PPCI_DEVICE_LIST PciDeviceList
    );

VOID
FreeDeviceResources(
    PDRIVER_OBJECT DriverObject,
    PDEVICE_OBJECT DeviceObject
    );

BOOLEAN
GetDeviceAddresses(
    IN PBASE_ADDRESS BaseAddress,
    IN ULONG ResourceCount,
    IN INTERFACE_TYPE InterfaceType,
    IN ULONG BusNumber
    );

NTSTATUS
GetAdapterInfo(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT DeviceOBject
    );
    
BOOLEAN
InitializePciHw(
    IN PVOID Context
    );

NTSTATUS
GetPciResources(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT DeviceOBject,
    IN PUNICODE_STRING RegistryPath
    );

VOID
ParseResourceList(
    IN PDEVICE_EXTENSION DeviceExtension,
    IN PCM_FULL_RESOURCE_DESCRIPTOR AdapterResources
    );

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

VOID
PciDmaDpc(
    IN PKDPC Dpc,
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

BOOLEAN
PciDmaISR(
    IN PKINTERRUPT Interrupt,
    IN PVOID ServiceContext
    );

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

VOID
PciDmaStartIo(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

VOID
PciDmaUnload(
    IN PDRIVER_OBJECT DriverObject
    );

VOID
ReleaseDeviceAddresses(
    IN PBASE_ADDRESS BaseAddress,
    IN ULONG ResourceCount
    );

BOOLEAN
SetBaseAddress(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
SetupIsrAndDpc(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
SetupPciDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath,
    IN ULONG BusNumber,
    IN ULONG SlotNumber,
    IN USHORT DeviceNumber
    );

BOOLEAN
StartIoSynchronized(
    IN PVOID Context
    );
    

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产伦一区二区三区免费| 欧美自拍偷拍一区| 欧美色老头old∨ideo| 久久亚洲私人国产精品va媚药| 尤物在线观看一区| 91年精品国产| 欧美国产综合色视频| 狠狠色2019综合网| 26uuu久久综合| 激情文学综合丁香| 精品国产sm最大网站免费看| 男女男精品网站| 91精品国产一区二区三区香蕉 | aaa国产一区| 国产视频一区不卡| 国产一区三区三区| 中文字幕乱码亚洲精品一区| 国产精品综合在线视频| 国产精品传媒视频| 91视频观看免费| 亚洲一区二区三区视频在线播放| 色综合久久久久久久久久久| 亚洲国产日韩精品| 91精品国产综合久久精品麻豆| 五月天精品一区二区三区| 91精品国产色综合久久久蜜香臀| 麻豆久久一区二区| 国产亚洲精品中文字幕| 一本大道久久a久久精品综合| 亚洲嫩草精品久久| 777xxx欧美| 国产精品1区2区3区在线观看| 国产精品久久免费看| 欧美三级视频在线| 韩国av一区二区三区四区| 国产精品久久二区二区| 欧美猛男gaygay网站| 成人午夜在线视频| 欧美aaaaa成人免费观看视频| 日本一二三四高清不卡| 国产午夜一区二区三区| 中文字幕一区二区三区视频| 色乱码一区二区三区88| 夜夜嗨av一区二区三区中文字幕| 色久优优欧美色久优优| 天天操天天干天天综合网| 精品国产乱码久久久久久牛牛| 成人精品免费看| 亚洲18女电影在线观看| 久久噜噜亚洲综合| 色噜噜久久综合| 精品一区二区三区日韩| 亚洲精品综合在线| 日韩欧美国产综合| 99re8在线精品视频免费播放| 亚洲成a人v欧美综合天堂| 亚洲精品在线观看视频| 欧美日韩视频一区二区| 国产传媒久久文化传媒| 青青草国产精品97视觉盛宴| 亚洲人成在线观看一区二区| 国产欧美日韩精品a在线观看| 欧美日韩精品一二三区| 91在线一区二区三区| 激情欧美一区二区三区在线观看| 亚洲宅男天堂在线观看无病毒| 精品日韩一区二区| 日韩一级成人av| 91精品国产福利| 欧美日韩免费电影| 欧美狂野另类xxxxoooo| 91福利视频久久久久| 国产盗摄视频一区二区三区| 亚洲观看高清完整版在线观看| 亚洲自拍欧美精品| 夜夜操天天操亚洲| 亚洲国产精品麻豆| 亚洲一区二区av在线| 亚洲黄色免费电影| 国产呦萝稀缺另类资源| 97久久精品人人澡人人爽| 欧美精三区欧美精三区| 日韩欧美成人一区二区| 国内不卡的二区三区中文字幕| 国产一区二区精品久久91| 99久久婷婷国产综合精品| 欧美日本国产视频| 中文字幕一区在线观看视频| 日韩电影在线一区二区三区| 国产成人av一区二区三区在线观看| 在线观看一区二区精品视频| 久久久久久黄色| 免费观看在线色综合| 色综合中文字幕国产 | 中文字幕av在线一区二区三区| 成人精品电影在线观看| 亚洲一级电影视频| **欧美大码日韩| 亚洲视频在线观看三级| 亚洲欧美aⅴ...| 一区二区三区欧美日| 亚洲国产精品久久艾草纯爱| 亚洲高清免费观看| 蜜臀99久久精品久久久久久软件| 免费高清成人在线| 国产成人av福利| 色久综合一二码| 日韩免费观看高清完整版| 26uuu国产电影一区二区| 国产女人18水真多18精品一级做 | 亚洲午夜精品17c| 麻豆成人91精品二区三区| 国产成人av影院| 欧美日韩成人综合天天影院| 精品久久久久久久久久久院品网| 久久久精品国产免大香伊| 亚洲三级在线免费| 毛片一区二区三区| 色哟哟在线观看一区二区三区| 欧美久久婷婷综合色| 国产精品久久久一本精品| 午夜精品免费在线观看| 91丝袜美腿高跟国产极品老师| 欧美精品视频www在线观看| 国产欧美视频一区二区| 蜜臀va亚洲va欧美va天堂| av中文字幕一区| 国产亚洲一区二区三区| 亚洲成av人影院| 欧美在线你懂得| 亚洲你懂的在线视频| 成人性生交大合| 亚洲国产精品二十页| 国产成人精品1024| 精品成a人在线观看| 久久国产精品99久久人人澡| 欧美高清你懂得| 日本视频一区二区三区| 欧美日韩在线三区| 午夜精品一区二区三区免费视频 | 日韩三级av在线播放| 午夜精品久久久久久| 欧美伦理影视网| 奇米影视一区二区三区| 欧美日韩午夜在线视频| 亚洲国产中文字幕在线视频综合| 成人av在线观| 亚洲国产日日夜夜| 欧美一级国产精品| 日韩国产在线观看| 久久综合色之久久综合| 国产成人精品免费一区二区| 日韩免费高清视频| 国产经典欧美精品| 亚洲裸体xxx| 制服丝袜亚洲色图| 国产美女娇喘av呻吟久久| 中文字幕精品一区二区精品绿巨人| 国产一区二区三区av电影| 国产精品久久久久久久久晋中 | 久久久99精品免费观看不卡| 久久精品国产亚洲一区二区三区| 久久一夜天堂av一区二区三区| 成人不卡免费av| 日本91福利区| 亚洲综合999| 国产视频视频一区| 欧美一区二区三区影视| 91天堂素人约啪| 国产精品一区二区三区乱码| 亚洲成国产人片在线观看| 自拍偷拍亚洲欧美日韩| 精品国产一二三| 欧美老女人在线| 欧美精品亚洲一区二区在线播放| 97久久久精品综合88久久| 国产精品1024久久| 精品一二三四区| 视频一区二区中文字幕| ...xxx性欧美| 亚洲色图在线视频| 中文字幕精品一区二区精品绿巨人| 欧美一区二区三区人| 欧美自拍丝袜亚洲| 精品视频资源站| 欧美性高清videossexo| 色婷婷激情一区二区三区| 成人视屏免费看| 国产成人丝袜美腿| 丁香婷婷综合网| 国产成人精品三级| 91亚洲男人天堂| 欧美午夜一区二区三区免费大片| 欧美日韩一区在线观看| 欧美日韩国产123区| 精品国产乱码久久久久久免费 | 亚洲综合色视频| 亚洲成av人片一区二区梦乃 | 色噜噜偷拍精品综合在线| 欧美人妖巨大在线|