⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 devioctl.cpp

📁 RTL8139 网卡驱动源码 for WinCE.net CEPC
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//****************************************************************************
//                            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 + -