?? devioctl.cpp
字號:
//****************************************************************************
// File DEVIOCTL.CPP
//
// IOCTL support for device
//
// Copyright (c) APSoft, 1998-2002.
// All rights reserved.
//
//****************************************************************************
#define INITGUID
extern "C"
{
#include <ntddk.h> // Main DDK's include
#include <wdmguid.h> // Interface IDs
#include <wmidata.h> // WMI GUIDs
#include <devguid.h> // GUIDs for device classes
#include <ntddpcm.h> // PCMCIA specific
}
#include <devclass.h> // Class declaration
#include <utils.h> // PnpQueryInterface
#include <projio.h> // IOCTLs
//------------------------------- Typedefs -----------------------------------
typedef NTSTATUS (CFuncDevice::* PFNIOCTL_HANDLER)(PIRP pIrp);
///////////////////////////////////////////////////////////////////////////////
// --- Structure IOCTL_DISP_HANDLER --- //
///////////////////////////////////////////////////////////////////////////////
typedef struct tagIOCTL_DISP_HANDLER // IOCTL handlers map entry
{
ULONG uIoCtrlCode;
PFNIOCTL_HANDLER pfnHandler;
} IOCTL_DISP_HANDLER, * PIOCTL_DISP_HANDLER;
///////////////////////////////////////////////////////////////////////////////
// -- I/O control dispatch map -- //
///////////////////////////////////////////////////////////////////////////////
static IOCTL_DISP_HANDLER IfaceTable[] =
{
{ IOCTL_GET_VERSION, CFuncDevice::OnGetVersion },
{ IOCTL_GET_ID_SIZE, CFuncDevice::OnGetIdSize },
{ IOCTL_GET_ID, CFuncDevice::OnGetId },
{ IOCTL_GET_ID_ASYNC, CFuncDevice::OnGetIdAsync },
{ IOCTL_GET_MEMORY, CFuncDevice::OnGetMemory },
{ IOCTL_GET_CIS, CFuncDevice::OnGetCIS },
{ IOCTL_REG_CLIENT, CFuncDevice::OnRegClient },
{ IOCTL_REL_CLIENT, CFuncDevice::OnRelClient },
{ IOCTL_GET_MASK, CFuncDevice::OnGetMask },
{ 0, NULL }
};
///////////////////////////////////////////////////////////////////////////////
// --- Class CFuncDevice --- //
///////////////////////////////////////////////////////////////////////////////
//****************************************************************************
// --- CFuncDevice::OnIrpDevCtrl ---
//
// Purpose: IRP_MJ_DEVICE_CONTROL handler
// Input: PIRP pIrp - IRP
// NTSTATUS & ntStatus - Operation status
// Output: BOOLEAN - FALSE to complete request outside
// Written: by Anton V. Krivenko 4/11/2002
//****************************************************************************
BOOLEAN CFuncDevice::OnIrpDevCtrl(PIRP pIrp, NTSTATUS & ntStatus)
{
STRACE_PNPDRV(">> CFuncDevice::OnIrpDevCtrl()\n");
ntStatus = STATUS_UNSUCCESSFUL;
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
ULONG uIoCode = pStack->Parameters.DeviceIoControl.IoControlCode;
for (ULONG uIdx = 0; IfaceTable[uIdx].pfnHandler != NULL; uIdx++)
{
if (IfaceTable[uIdx].uIoCtrlCode == uIoCode)
{
ntStatus = (this->*(IfaceTable[uIdx].pfnHandler))(pIrp);
break;
} // if (IfaceTable[uIdx]....
} // for (ULONG uIdx = 0; ...
STRACE_PNPDRV("<< CFuncDevice::OnIrpDevCtrl()- ntStatus=%08lX\n", ntStatus);
return FALSE;
}
//****************************************************************************
// --- CFuncDevice::OnGetVersion ---
//
// Purpose: IOCTL_REL_CLIENT handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
//****************************************************************************
NTSTATUS CFuncDevice::OnRelClient(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetVersion()\n");
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
//PULONG pInput = (PULONG)pIrp->AssociatedIrp.SystemBuffer;
MmUnmapIoSpace((PVOID)m_uMemBaseAddr,m_uLength);
return ntStatus;
}
//****************************************************************************
// --- CFuncDevice::OnGetVersion ---
//
// Purpose: IOCTL_REG_CLIENT handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
//****************************************************************************
NTSTATUS CFuncDevice::OnRegClient(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetVersion()\n");
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
if(m_uLength == 0)
return STATUS_UNSUCCESSFUL;
m_uMemBaseAddr = (ULONG)MmMapIoSpace(m_phyMemAddr,m_uLength,MmNonCached);
if(!m_uMemBaseAddr)
{
return STATUS_UNSUCCESSFUL;
}
return ntStatus;
}
//****************************************************************************
// --- CFuncDevice::OnGetVersion ---
//
// Purpose: IOCTL_GET_VERSION handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
//****************************************************************************
NTSTATUS CFuncDevice::OnGetCIS(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetVersion()\n");
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
PVOID pData = pIrp->UserBuffer;
if(!m_BusIface.ReadCfgSpace((PUCHAR)pData,0,256))
{
return STATUS_UNSUCCESSFUL;
}
return ntStatus;
}
//****************************************************************************
// --- CFuncDevice::OnGetVersion ---
//
// Purpose: IOCTL_GET_VERSION handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
//****************************************************************************
NTSTATUS CFuncDevice::OnGetMemory(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetVersion()\n");
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
PGET_READMEMORY pInput = (PGET_READMEMORY)pIrp->AssociatedIrp.SystemBuffer;
ULONG uOutSize = pStack->Parameters.DeviceIoControl.OutputBufferLength;
PVOID pData = pIrp->UserBuffer;
ULONG uOffset = pInput->dwOffset;
ULONG uLength = pInput->dwLength;
if(uOutSize < uLength)
{
return STATUS_UNSUCCESSFUL;
}
if(uLength > m_uLength)
{
return STATUS_UNSUCCESSFUL;
}
if(m_PcmciaIface.MapMemoryWindow(m_uStart,
uOffset,
m_uLength,
2,
PCMCIA_MEMORY_16BIT_ACCESS))
{
READ_REGISTER_BUFFER_UCHAR((PUCHAR)m_uMemBaseAddr,(PUCHAR)pData,uLength);
}
return ntStatus;
}
//****************************************************************************
// --- CFuncDevice::OnGetVersion ---
//
// Purpose: IOCTL_GET_VERSION handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -