📄 pcidpinc.h
字号:
//*****************************************************************************
// THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
// OR IMPLIED. THIS CODE IS COPYRIGHTED AND MAY NOT BE MODIFIED OR DISTRIBUTED
// WITHOUT THE WRITTEN CONSENT OF THE PRODUCER.
//
// Copyright (C) 2002, Foxen Solutions
// Copyright (C) 2002, FXN
//
// All Rights Reserved.
//*****************************************************************************
//
// ----------------------------------------------------------------------------
// This is PCIDPinc.h. It is the include file for PCIDP.c.
// ----------------------------------------------------------------------------
#ifndef _PCIDP_INC
#define _PCIDP_INC
#include "stddef.h"
#include "ntddk.h"
// Define PCIDP card attributes
#define DMASize 0x4000
// Define PCIDP card register offset.
#define HINT 0x139
// Define interrupt types and bit masks.
#define PCIMasterAbort 0x200
#define PCITargetAbort 0x100
#define I2OOutboundPostFIFONotEmpty 0x80
#define DMAComplete 0x20
#define LocalToHostExternalSignal 0x10
#define LocalToHostMailbox 8
#define I2OPCIFIFOOverflow 2
#define InterruptQueSize 16
// Define linked list services constants.
#define LL_NEW 0
#define LL_ACQUIRED 1
#define LL_INSERTED 2
#define LL_AVAILABLE 3
#define LL_CHECKEDOUT 4
// Define any structures, variables, etc.
typedef struct {
ULONG Type;
PIRP Irp;
} REGISTERED_INTERRUPT, *PREGISTERED_INTERRUPT;
typedef struct _LINKED_LIST{
struct _LINKED_LIST* Next;
struct _LINKED_LIST* Prev;
UCHAR Status;
REGISTERED_INTERRUPT RegisteredInterrupt;
} LINKED_LIST, *PLINKED_LIST;
typedef struct {
UCHAR QueNext;
UCHAR QueNew;
ULONG Type[InterruptQueSize];
} INTERRUPT_DATA, *PINTERRUPT_DATA;
typedef struct {
BOOLEAN IsEmpty;
USHORT InsertedCount;
USHORT FreeMax;
PLINKED_LIST CurrentLink;
} LL_DATA, *PLL_DATA;
typedef struct{
//ULONG BusNumber;
//PCI_SLOT_NUMBER SlotNumber;
//ULONG BoardNumber;
//ULONG BaseAddresses[6];
PHYSICAL_ADDRESS MemoryAccess;
PHYSICAL_ADDRESS IOAccess;
ULONG MemoryAccessLength;
ULONG IOAccessLength;
ULONG* MemoryBase;
ULONG IOBase;
PKINTERRUPT InterruptObject;
INTERRUPT_DATA InterruptData;
LL_DATA LLData;
KSPIN_LOCK LListSpin;
PVOID VirtualDMAAddress;
ULONG PhysicalDMAAddress;
PMDL MDL;
UNICODE_STRING SymbolicLinkName;
//PDEVICE_OBJECT PhysicalDeviceObject;
PDEVICE_OBJECT NextLowerDeviceObject;
KEVENT WaitEvent;
} PCIDP_EXTENSION, *PPCIDP_EXTENSION;
// Declare the prototypes for the routines that make up this driver.
// Public (System)
NTSTATUS DriverEntry(
IN OUT PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS PCIDPAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
NTSTATUS PCIDPDispatchPower(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS PCIDPDispatchPnp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS PCIDPDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS PCIDPCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS PCIDPCleanup(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS PCIDPUnload(
IN PDRIVER_OBJECT DriverObject
);
VOID PCIDPCancelInterrupt(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
VOID PCIDPForDpcIsr(
IN PKDPC Dpc,
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
BOOLEAN PCIDPISR(
IN PKINTERRUPT Interrupt,
IN OUT PVOID Context
);
VOID PCIDPCancelMapDMARoutine(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
// Public
VOID PCIDPGetDriverVersion(
IN OUT PIRP Irp,
OUT PVOID IoBuffer,
IN ULONG OutputBufferLength
);
VOID PCIDPMapBaseRegs(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp,
IN OUT PVOID IoBuffer,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
VOID PCIDPUnMap(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp,
IN PVOID IoBuffer,
IN ULONG InputBufferLength
);
VOID PCIDPMapDMAMem(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp,
OUT PVOID IoBuffer,
IN ULONG OutputBufferLength
);
VOID PCIDPCancelMapDMA(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp,
IN PVOID IoBuffer,
IN ULONG InputBufferLength
);
VOID PCIDPUnMapDMA(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp,
IN PVOID IoBuffer,
IN ULONG InputBufferLength
);
VOID PCIDPGetPCIRegs(
IN PDEVICE_OBJECT DeviceObject,
IN PFILE_OBJECT FileObject,
IN OUT PIRP Irp,
OUT PVOID IoBuffer,
IN ULONG OutputBufferLength
);
VOID PCIDPSetPCIRegs(
IN PDEVICE_OBJECT DeviceObject,
IN PFILE_OBJECT FileObject,
IN OUT PIRP Irp,
IN PVOID IoBuffer,
IN ULONG InputBufferLength
);
VOID PCIDPRegisterInterrupt(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp,
IN OUT PVOID IoBuffer,
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength
);
VOID PCIDPUnregisterInterrupt(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp,
IN OUT PVOID IoBuffer,
IN ULONG InputBufferLength
);
// Private
NTSTATUS StartDevice(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS StopDevice(IN PDEVICE_OBJECT DeviceObject);
NTSTATUS CancelStopDevice(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS RemoveDevice(IN PDEVICE_OBJECT DeviceObject);
NTSTATUS DeviceCompletionRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
BOOLEAN GetResources(
CM_RESOURCE_LIST* Resources,
UCHAR CmResourceType,
ULONG* LIdx,
ULONG* DIdx
);
BOOLEAN PCIDPISR(
IN PKINTERRUPT Interrupt,
IN OUT PVOID Context
);
VOID PCIDPForDpcIsr(
IN PKDPC Dpc,
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
BOOLEAN GetNextEntry(
PPCIDP_EXTENSION ObjExt,
PLINKED_LIST* FirstLink,
PLINKED_LIST* CurrentLink,
PREGISTERED_INTERRUPT* Entry
);
BOOLEAN PutBackEntry(
PPCIDP_EXTENSION ObjExt,
PLINKED_LIST CurrentLink
);
BOOLEAN FreeEntry(
IN PPCIDP_EXTENSION ObjExt,
PLINKED_LIST CurrentLink
);
PLINKED_LIST GetFreeEntry(IN PPCIDP_EXTENSION ObjExt);
BOOLEAN InsertEntry(
IN PPCIDP_EXTENSION ObjExt,
IN PLINKED_LIST Entry
);
BOOLEAN DeleteAllEntries(IN PPCIDP_EXTENSION ObjExt);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -