oemioctl.c
来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 771 行 · 第 1/2 页
C
771 行
/* -*-C-*-
*
* $Revision: 1.7 $
* $Author: kwelton $
* $Date: 2000/08/08 21:45:52 $
*
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
* PARTICULAR PURPOSE.
*
* Copyright (c) 1995, 1996, 1997, 1998 Microsoft Corporation
* Copyright (c) 1999 ARM Limited
* All Rights Reserved
*/
/*++
Module Name:
Abstract:
NK Kernel Generic I/O Control Interface
Functions:
Notes:
This file does not form part of the ARM template. It is included to
show how iocontrol can be implemented in WindowsCE.
--*/
#define WINCEMACRO 1
#include <windows.h>
#include <ceddk.h>
#include <arm_ddk.h>
#include <nkintr.h>
#include <halether.h>
#include <pkfuncs.h>
#include <iltiming.h>
#include <ethdbg.h>
#include <platform.h>
#include "drv_glob.h"
#include "dbt.h"
#ifdef HALPROFILE
BOOL HalProfileControl(LPVOID pProfCtrl, LPVOID lpOutBuf,
DWORD nOutBufSize, LPDWORD lpBytesReturned);
#endif
#ifdef IMGSHAREETH
BOOL OEMEthCurrentPacketFilter(PDWORD pdwRequestedFilter);
BOOL OEMEthMulticastList(PUCHAR pucMulticastAddressList, DWORD dwNoOfAddresses);
#endif
#undef HAL_DVCM
#ifdef HAL_DVCM
extern HRESULT Ioctl_Register_DataCollector(LPVOID,DWORD,LPVOID,DWORD);
extern HRESULT Ioctl_Send_DataCollector(LPVOID,DWORD,LPVOID,DWORD);
extern HRESULT Ioctl_Unregister_DataCollector(LPVOID,DWORD,LPVOID,DWORD);
#endif
#ifdef INTERNAL_HAL_TESTING
#include "intioctl.h"
#include "intioctl.c"
#endif
#define pDriverGlobals ((PDRIVER_GLOBALS)DRIVER_GLOBALS_PHYSICAL_MEMORY_START)
ULONG PCIGetBusDataByOffset(IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length);
ULONG PCISetBusDataByOffset(IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length);
BOOL PCI_FindDevice(unsigned short vendor, unsigned short device,
unsigned int instance, unsigned char *bus,
unsigned char *slot, unsigned char *func);
int GetPCIConfig(ULONG bus, ULONG device, ULONG function,
PCI_COMMON_CONFIG *pConfig);
int SetPCIConfig(ULONG bus, ULONG device, ULONG function,
PCI_COMMON_CONFIG *pConfig);
ULONG OEMMapIntLogic2SysIntr(ULONG nLogical);
unsigned int strlenW(LPCWSTR str);
const WCHAR HALPlatformStr[] = L"ARM platform";
const WCHAR HALOEMStr[] = L"ARM";
// ILTIMING Globals
BOOL fIntrTime;
BOOL fIntrTimeToggle;
WORD wNumInterrupts;
DWORD dwIsrTime1, dwIsrTime2;
DWORD dwSPC;
DWORD dwIntrTimeCountdown;
DWORD dwIntrTimeCountdownRef;
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
ULONG OEMGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length)
{
switch ( BusDataType ) {
case PCIConfiguration:
return(PCIGetBusDataByOffset(BusNumber,SlotNumber,Buffer,Offset,Length));
default:
return (0);
}
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
ULONG OEMSetBusDataByOffset(
IN BUS_DATA_TYPE BusDataType,
IN ULONG BusNumber,
IN ULONG SlotNumber,
IN PVOID Buffer,
IN ULONG Offset,
IN ULONG Length)
{
switch ( BusDataType ) {
case PCIConfiguration:
return(PCISetBusDataByOffset(BusNumber,SlotNumber,Buffer,Offset,Length));
default:
return(0);
}
}
#ifdef NotYet
NEEDS TO BE LOOKED AT .....
// -----------------------------------------------------------------------------
//
// @func BOOL | OEMGetUUID | Get UUID
// @rdesc none
// @comm This function will attempt to find an assigned IP address and
// return a UUID based on this value. Since this is a sample
// platform we can get away with this. A released product should
// either have a ROM serial number or perhaps use the MAC address
// of an ether net adapter as the source of the UUID
//
// -----------------------------------------------------------------------------
BOOL OEMGetUUID(GUID *pGUID)
{
DWORD Index;
HKEY hKey;
HKEY hMiniportKey;
HKEY hTcpIpKey;
TCHAR szTemp[128];
TCHAR szBaseKey[128];
TCHAR MiniportName[32];
DWORD MiniportNameLength;
DWORD dwType;
DWORD dwSize;
BOOL RetVal = FALSE;
memcpy(szBaseKey, TEXT("Comm"), sizeof(TEXT("Comm")));
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szBaseKey, 0,
KEY_READ, &hKey) != ERROR_SUCCESS)
{
DEBUGMSG(1, (TEXT("OEMGetUUID: unable to open registry\r\n")));
return FALSE;
}
for (Index = 0; TRUE; Index++)
{
MiniportNameLength = sizeof(MiniportName);
if (RegEnumKeyEx(hKey, Index, MiniportName,
&MiniportNameLength, NULL, NULL,
NULL, NULL) != ERROR_SUCCESS)
break;
// Check if this is really an ndis driver.
if (RegOpenKeyEx(hKey, MiniportName, 0, KEY_READ,
&hMiniportKey) != ERROR_SUCCESS)
continue;
// Check the group
dwSize = sizeof(szTemp);
if (RegQueryValueEx (hMiniportKey, TEXT("Group"), 0,
&dwType, (LPBYTE)szTemp, &dwSize))
{
DEBUGMSG(1, (TEXT(" OEMGetUUID: Couldn't find Group\r\n")));
RegCloseKey(hMiniportKey);
continue;
}
if (memcmp(szTemp, TEXT("NDIS"), sizeof(TEXT("NDIS"))))
{
DEBUGMSG (1, (TEXT(" OEMGetUUID: Group doesn't match\r\n")));
RegCloseKey(hMiniportKey);
continue;
}
if (RegOpenKeyEx(hMiniportKey, TEXT("Parms\\TcpIp"), 0, KEY_READ,
&hTcpIpKey) != ERROR_SUCCESS)
{
DEBUGMSG(1, (TEXT(" OEMGetUUID: Couldn't open TcpIp\r\n")));
RegCloseKey(hMiniportKey);
continue;
}
// Is there a DHCPIpAddress Key?
dwSize = sizeof(szTemp);
if (RegQueryValueEx(hTcpIpKey, TEXT("DhcpIPAddress"), 0,
&dwType, (LPBYTE)szTemp, &dwSize))
{
// Try to see if there is a IPAddress String.
if (RegQueryValueEx(hTcpIpKey, TEXT("IPAddress"), 0,
&dwType, (LPBYTE)szTemp, &dwSize))
{
DEBUGMSG(1, (TEXT(" OEMGetUUID: Couldn't get IP Address \r\n")));
RegCloseKey (hTcpIpKey);
RegCloseKey (hMiniportKey);
continue;
}
}
RETAILMSG(1, (TEXT("IPAddress='%s'\r\n"), szTemp));
if (memcmp(szTemp, TEXT("0.0.0.0"), sizeof(TEXT("0.0.0.0"))))
{
// Just copy the string on top of the GUID,
memcpy((char *)pGUID, szTemp, sizeof(GUID));
RetVal = TRUE;
// RetVal = FALSE; // This crashes mstsc.exe
}
RegCloseKey(hTcpIpKey);
RegCloseKey(hMiniportKey);
if (RetVal)
break;
}
RegCloseKey(hKey);
return RetVal;
}
#endif /* NotYet */
/*
* @func BOOL | OEMIoControl | generic HAL request
*
* @rdesc none
*
* @comm OEMIoControl is called by the Kernel when a device driver or
* application program calls <f KernelIoControl>. The system is
* fully preemptible when this function is called. The kernel
* does no processing of this API. It is provided to allow an
* OEM device driver to communicate with kernel mode HAL code.
*
* @xref Overview.Windows CE Kernel OEM Interface KernelIoControl
*/
BOOL OEMIoControl(DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize,
LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned)
{
BOOL retval = FALSE;
DWORD len;
PIP_INFO pIPInfo;
PUDP_PACKET pUDPPacket;
EDBG_ADDR *pEdbgAddr;
EDBG_ADDR DestAddr;
DEBUGMSG(0, (TEXT("+OEMIoControl %X\r\n"), dwIoControlCode));
switch (dwIoControlCode)
{
case IOCTL_HAL_GET_DEVICE_INFO:
if (nInBufSize == 4)
{
switch (*(LPDWORD)lpInBuf)
{
case SPI_GETPLATFORMTYPE:
len = (strlenW(HALPlatformStr)+1)*sizeof(WCHAR);
if (nOutBufSize >= len)
{
memcpy(lpOutBuf,HALPlatformStr,len);
retval = TRUE;
}
else
SetLastError(ERROR_INSUFFICIENT_BUFFER);
break;
case SPI_GETOEMINFO:
len = (strlenW(HALOEMStr)+1)*sizeof(WCHAR);
if (nOutBufSize >= len)
{
memcpy(lpOutBuf,HALOEMStr,len);
retval = TRUE;
}
else
SetLastError(ERROR_INSUFFICIENT_BUFFER);
break;
default:
SetLastError(ERROR_INVALID_PARAMETER);
}
}
else
SetLastError(ERROR_INVALID_PARAMETER);
break;
case IOCTL_HAL_DDK_CALL:
// For now, the only ddk ioctls in CEPC are SetBusData & GetBusData
if ((nInBufSize != sizeof(BUSDATA_PARMS)) ||
(!lpInBuf))
// Oops, parameter list isn't what we expected.
return FALSE;
if (*(DWORD *)lpInBuf == IOCTL_HAL_SETBUSDATA )
{
((PBUSDATA_PARMS)lpInBuf)->ReturnCode = OEMSetBusDataByOffset(
((PBUSDATA_PARMS)lpInBuf)->BusDataType,
((PBUSDATA_PARMS)lpInBuf)->BusNumber,
((PBUSDATA_PARMS)lpInBuf)->SlotNumber,
((PBUSDATA_PARMS)lpInBuf)->Buffer,
((PBUSDATA_PARMS)lpInBuf)->Offset,
((PBUSDATA_PARMS)lpInBuf)->Length);
return TRUE;
}
else if (*(DWORD *)lpInBuf == IOCTL_HAL_GETBUSDATA)
{
((PBUSDATA_PARMS)lpInBuf)->ReturnCode = OEMGetBusDataByOffset(
((PBUSDATA_PARMS)lpInBuf)->BusDataType,
((PBUSDATA_PARMS)lpInBuf)->BusNumber,
((PBUSDATA_PARMS)lpInBuf)->SlotNumber,
((PBUSDATA_PARMS)lpInBuf)->Buffer,
((PBUSDATA_PARMS)lpInBuf)->Offset,
((PBUSDATA_PARMS)lpInBuf)->Length);
return TRUE;
}
else
// Oops, parameter list isn't what we expected.
return FALSE;
break;
case IOCTL_HAL_GETPCIDEVICEINFO:
{
PCIDeviceInfo *in;
PCIDeviceInfo *out;
if ((lpInBuf == NULL || (nInBufSize < sizeof(PCIDeviceInfo))) ||
(lpOutBuf == NULL || (nOutBufSize < sizeof(PCIDeviceInfo))))
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
in = (PCIDeviceInfo *)lpInBuf;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?