📄 wince.c
字号:
[HKEY_LOCAL_MACHINE\Comm\CELAN1]
"DisplayName"="CELAN Compatible Ethernet Driver"
"Group"="NDIS"
"ImagePath"="celan.dll"
[HKEY_LOCAL_MACHINE\Comm\CELAN1\Parms]
"BusNumber"=dword:0
"BusType"=dword:8
"InterruptNumber"=dword:03
"IoBaseAddress"=dword:0300
"Transceiver"=dword:3
"CardType"=dword:1
*/
DWORD i;
LPWSTR lpDetectKeyName;
DEBUGMSG(ZONE_INIT,
(TEXT("CELAN:Install_Driver(%s, %s, %d)\r\n"),
lpPnpId, lpRegPath, cRegPathSize));
if ((lpDetectKeyName = FindDetectKey()) == NULL) {
return NULL;
}
if (!AddKeyValues(lpDetectKeyName, DetectKeyValues)) {
goto wid_fail1;
}
for (i = 0; i < (sizeof(KeyNames)/sizeof(LPWSTR)); i++) {
if (!AddKeyValues(KeyNames[i], Values[i])) {
goto wid_fail;
}
}
LocalFree(lpDetectKeyName);
//
// Return "Drivers\\PCMCIA\\CELAN"
//
wcscpy(lpRegPath, KeyNames[0]);
return lpRegPath;
wid_fail:
//
// Clean up after ourself on failure.
//
for (i = 0; i < (sizeof(KeyNames)/sizeof(LPWSTR)); i++) {
RegDeleteKey(HKEY_LOCAL_MACHINE,KeyNames[i]);
}
wid_fail1:
RegDeleteKey(HKEY_LOCAL_MACHINE, lpDetectKeyName);
LocalFree(lpDetectKeyName);
return NULL;
}
//
// Find an unused Detect key number and return the registry path name for it.
//
// Return NULL for failure
//
LPWSTR
FindDetectKey(VOID)
{
HKEY hDetectKey;
DWORD dwKeyNum;
DWORD dwDisp;
DWORD Status;
WCHAR * pKeyName;
LPWSTR pKeyNum;
pKeyName = LocalAlloc(LPTR, sizeof(WCHAR) * 255);
if (pKeyName == NULL) {
return NULL;
}
wcscpy(pKeyName, (TEXT("Drivers\\PCMCIA\\Detect\\")));
pKeyNum = pKeyName + wcslen(pKeyName);
//
// Find a detect number and create the detect key.
//
for (dwKeyNum = 40; dwKeyNum < 99; dwKeyNum++) {
wsprintf(pKeyNum, (TEXT("%02d")), dwKeyNum);
Status = RegCreateKeyEx(
HKEY_LOCAL_MACHINE,
pKeyName,
0,
NULL,
REG_OPTION_NON_VOLATILE,
0,
NULL,
&hDetectKey,
&dwDisp);
if (Status == ERROR_SUCCESS) {
RegCloseKey(hDetectKey);
if (dwDisp == REG_CREATED_NEW_KEY) {
return pKeyName;
}
}
}
LocalFree(pKeyName);
return NULL;
}
#define NUM_CFTABLE_ENTRIES 10
LPWSTR
DetectCELAN(
CARD_SOCKET_HANDLE hSock,
UCHAR DevType,
LPWSTR DevKey,
DWORD DevKeyLen
)
{
CARD_CLIENT_HANDLE hPcmcia = NULL;
HANDLE hPcmciaDll = NULL;
REGISTERCLIENT pfnRegisterClient;
DEREGISTERCLIENT pfnDeregisterClient;
GETPARSEDTUPLE pfnGetParsedTuple;
REQUESTWINDOW pfnRequestWindow;
RELEASEWINDOW pfnReleaseWindow;
MAPWINDOW pfnMapWindow;
REQUESTCONFIG pfnRequestConfig;
RELEASECONFIG pfnReleaseConfig;
RESETFUNCTION pfnResetFunction;
CARD_REGISTER_PARMS Parms;
CARD_WINDOW_PARMS Cwp;
CARD_WINDOW_HANDLE hMemWin;
DWORD MemGran;
volatile PUCHAR pPort;
CARD_CONFIG_INFO CfgInfo;
PARSED_CFTABLE CfTable[NUM_CFTABLE_ENTRIES];
DWORD cerr;
DWORD cCFTs,iCFT,iRange;
UCHAR Cmd;
LPWSTR lpRet;
if (DevType != PCCARD_TYPE_NETWORK) {
return NULL;
}
hPcmciaDll = LoadLibrary(TEXT("PCMCIA.DLL"));
if (hPcmciaDll == NULL) {
return NULL;
}
pfnGetParsedTuple = (GETPARSEDTUPLE) GetProcAddress(hPcmciaDll, TEXT("CardGetParsedTuple"));
pfnMapWindow = (MAPWINDOW) GetProcAddress(hPcmciaDll, TEXT("CardMapWindow"));
pfnRegisterClient = (REGISTERCLIENT) GetProcAddress(hPcmciaDll, TEXT("CardRegisterClient"));
pfnDeregisterClient = (DEREGISTERCLIENT) GetProcAddress(hPcmciaDll, TEXT("CardDeregisterClient"));
pfnRequestConfig = (REQUESTCONFIG) GetProcAddress(hPcmciaDll, TEXT("CardRequestConfiguration"));
pfnReleaseConfig = (RELEASECONFIG) GetProcAddress(hPcmciaDll, TEXT("CardReleaseConfiguration"));
pfnRequestWindow = (REQUESTWINDOW) GetProcAddress(hPcmciaDll, TEXT("CardRequestWindow"));
pfnReleaseWindow = (RELEASEWINDOW) GetProcAddress(hPcmciaDll, TEXT("CardReleaseWindow"));
pfnResetFunction = (RESETFUNCTION) GetProcAddress(hPcmciaDll, TEXT("CardResetFunction"));
lpRet = NULL;
if ((pfnGetParsedTuple == NULL) ||
(pfnMapWindow == NULL) ||
(pfnRegisterClient == NULL) ||
(pfnDeregisterClient == NULL) ||
(pfnRequestConfig == NULL) ||
(pfnReleaseConfig == NULL) ||
(pfnResetFunction == NULL) ||
(pfnRequestWindow == NULL) ||
(pfnReleaseWindow == NULL)) {
DEBUGMSG(ZONE_INIT, (TEXT("DetectCELAN: Failed to load PCMCIA.DLL\r\n")));
goto dn_fail1;
}
//
// Find which configuration to use
//
cCFTs = NUM_CFTABLE_ENTRIES;
cerr = pfnGetParsedTuple(hSock, CISTPL_CFTABLE_ENTRY, CfTable, &cCFTs);
if (cerr != CERR_SUCCESS) {
DEBUGMSG(ZONE_INIT,
(TEXT("DetectCELAN: CardGetParsedTuple failed %d\r\n"),
cerr));
goto dn_fail1;
}
for (iCFT = 0; iCFT < cCFTs; iCFT++) {
for (iRange = 0; iRange < CfTable[iCFT].NumIOEntries; iRange++) {
if ((CfTable[iCFT].IOLength[iRange] == 31) &&
((CfTable[iCFT].IOBase[iRange] == 0x300) ||
(CfTable[iCFT].IOBase[iRange] == 0x320) ||
(CfTable[iCFT].IOBase[iRange] == 0x340) ||
(CfTable[iCFT].IOBase[iRange] == 0x360))) {
goto dn_got_range;
}
}
}
DEBUGMSG(ZONE_INIT,
(TEXT("DetectCELAN: No CELAN address ranges found!\r\n")));
goto dn_fail1;
dn_got_range:
DEBUGMSG(ZONE_INIT,
(TEXT("DetectCELAN: Using Config index 0x%x, range 0x%x %d\r\n"),
CfTable[iCFT].ConfigIndex, CfTable[iCFT].IOBase[iRange],
CfTable[iCFT].IOLength[iRange]));
//
// Register with PCMCIA driver
//
Parms.fEventMask = EVENT_MASK_CARD_DETECT|EVENT_MASK_POWER_MGMT;
Parms.fAttributes = CLIENT_ATTR_IO_DRIVER | CLIENT_ATTR_NOTIFY_SHARED |
CLIENT_ATTR_NOTIFY_EXCLUSIVE;
hPcmcia = (CARD_CLIENT_HANDLE)pfnRegisterClient(NULL, &Parms);
if (hPcmcia == 0) {
DEBUGMSG(ZONE_INIT,
(TEXT("DetectCELAN: CardRegisterClient failed %d\r\n"),
GetLastError()));
goto dn_fail1;
}
//
// Request a Pcmcia IO window
//
Cwp.hSocket = hSock;
Cwp.fAttributes = WIN_ATTR_IO_SPACE;
Cwp.uWindowSize = 0x20;
Cwp.fAccessSpeed = WIN_SPEED_USE_WAIT;
hMemWin = pfnRequestWindow(hPcmcia, &Cwp);
if (hMemWin == NULL) {
DEBUGMSG(ZONE_INIT, (TEXT("DetectCELAN: CardRequestWindow failed %d\r\n"),
GetLastError()));
goto dn_fail1;
}
//
// Map the Pcmcia IO window
//
pPort = pfnMapWindow(hMemWin, CfTable[iCFT].IOBase[iRange], 0x20, &MemGran);
if (pPort == NULL) {
DEBUGMSG(ZONE_INIT, (TEXT("DetectCELAN: CardMapWindow failed %d\r\n"),
GetLastError()));
goto dn_fail;
}
//
// Use CardRequestConfiguration to place card in I/O mode
//
CfgInfo.hSocket = hSock;
CfgInfo.fAttributes = 0;
CfgInfo.fInterfaceType = CFG_IFACE_MEMORY_IO;
CfgInfo.uVcc = 50;
CfgInfo.uVpp1 = 0;
CfgInfo.uVpp2 = 0;
CfgInfo.fRegisters = CFG_REGISTER_CONFIG|CFG_REGISTER_STATUS;
CfgInfo.uConfigReg = CfTable[iCFT].ConfigIndex;
CfgInfo.uStatusReg = FCR_FCSR_REQUIRED_BITS;
cerr = pfnRequestConfig(
hPcmcia,
&CfgInfo);
if (cerr != CERR_SUCCESS) {
DEBUGMSG(ZONE_INIT,
(TEXT("DetectCELAN: CardRequestConfiguration failed %d\r\n"),
cerr));
goto dn_fail;
}
pPort[NIC_INTR_MASK] = 0; // Turn off CELAN interrupts
pPort[NIC_COMMAND] = 0x21; // Tell CELAN to stop
Sleep(2000);
Cmd = pPort[NIC_COMMAND]; // Check response
switch (Cmd) {
case 0x21:
case 0x23:
lpRet = DevKey;
wcscpy(DevKey, TEXT("CELAN"));
break;
default:
DEBUGMSG(ZONE_INIT,
(TEXT("DetectCELAN: CELAN command port = 0x%x\r\n"), Cmd));
}
pfnResetFunction(hPcmcia, hSock);
pfnReleaseConfig(hPcmcia, hSock);
dn_fail:
pfnReleaseWindow(hMemWin);
cerr = pfnDeregisterClient(hPcmcia);
if (cerr) {
DEBUGMSG(ZONE_INIT, (TEXT("DetectCELAN: CardDeregisterClient failed %d\r\n"),
cerr));
}
dn_fail1:
FreeLibrary(hPcmciaDll);
return lpRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -