📄 common.cpp
字号:
//don't change power-related parameters
confInfo.uVcc = (UINT8)(pTable->VccDescr.NominalV);
confInfo.uVpp1 = (UINT8)(pTable->Vpp1Descr.NominalV);
confInfo.uVpp2 = (UINT8)(pTable->Vpp2Descr.NominalV);
//retrieve current registry values
if(RetrieveRegisterValues(&confInfo, hSocket) == FALSE){
g_pKato->Log(LOG_FAIL,TEXT("Socket %u: Function %u: can not retreive configuration register values.\r\n"),
uSock, uFunc);
delete[] parsedBuf;
return FALSE;
}
//now request configuration
status = CardRequestConfiguration(hClient, &confInfo);
if(status != CERR_SUCCESS){//if it failed, try the next configuation table
g_pKato->Log(LOG_FAIL,TEXT("Socket %u: Function %u: Request config on No. %u config table failed\r\n"),
uSock, uFunc, i);
g_pKato->Log(LOG_FAIL,TEXT("uVcc = %u, uVpp1 = %u, uVpp2 = %u\r\n"),
confInfo.uVcc, confInfo.uVpp1, confInfo.uVpp2);
}
else{
g_pKato->Log(LOG_DETAIL,TEXT("Socket %u: Function %u: RequestConfig on No. %u config table succeed!\r\n"),
uSock, uFunc, i);
g_pKato->Log(LOG_DETAIL,TEXT("uVcc = %u, uVpp1 = %u, uVpp2 = %u\r\n"),
confInfo.uVcc, confInfo.uVpp1, confInfo.uVpp2);
fConfigured = TRUE;
break;
}
pCur = (PBYTE)pCur + sizeof(PARSED_PCMCFTABLE);
}
delete[] parsedBuf;
return fConfigured;
}
BOOL
RetrieveRegisterValues(PCARD_CONFIG_INFO pConfInfo, CARD_SOCKET_HANDLE hSocket){
if(pConfInfo == NULL)
return FALSE;
STATUS status = CERR_SUCCESS;
if(pConfInfo == NULL)
return FALSE;
//read ConfigReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 0, &(pConfInfo->uConfigReg));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access ConfigReg\r\n")));
}
//read StatusReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 1, &(pConfInfo->uStatusReg));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access StatusReg\r\n")));
}
//read PinReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 2, &(pConfInfo->uPinReg));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access PinReg\r\n")));
}
//read uCopyReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 3, &(pConfInfo->uCopyReg));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access CopyReg\r\n")));
}
//read uExtendedStatusReg
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 4, &(pConfInfo->uExtendedStatus));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access ExtendedStatusReg\r\n")));
}
//read IOBases
for(int i = 0; i < NUM_EXT_REGISTERS; i++){
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, NUM_REGISTERS+i, &(pConfInfo->IOBase[i]));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access IOBase no. %d\r\n"), i));
}
}
//read IOLimit
status = CardAccessConfigurationRegister(g_hClient, hSocket, CARD_FCR_READ, 9, &(pConfInfo->IOLimit));
if(status != CERR_SUCCESS){
DEBUGMSG(ZONE_WARNING, (TEXT("Can not access IOLimit\r\n")));
}
return TRUE;
}
STATUS
CardGetParsedTuple(CARD_SOCKET_HANDLE hSocket, UINT8 DesiredTuple, PVOID pBuf,PUINT pnItems){
STATUS status = CERR_BAD_ARGS;
if(pnItems == NULL)
return status;
DEBUGMSG(ZONE_VERBOSE, (TEXT("CardGetParsedTuple entered %d\r\n"), DesiredTuple));
if (pnItems != NULL) {
__try {
switch (DesiredTuple) {
case CISTPL_CONFIG:
status = ParseConfig(hSocket, pBuf, pnItems);
break;
case CISTPL_CFTABLE_ENTRY:
status = ParseCfTable(hSocket, pBuf, pnItems);
break;
default:
status = CERR_BAD_ARGS;
break;
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
status=CERR_BAD_HANDLE;
}
}
if (status) {
DEBUGMSG(ZONE_ERROR,(TEXT("Socket %u, Func %u: CardGetParsedTuple for %d failed, error= %d\r\n"),
hSocket.uSocket, hSocket.uFunction, DesiredTuple, status));
} else {
DEBUGMSG(ZONE_VERBOSE, (TEXT("CardGetParsedTuple succeeded\r\n")));
}
return status;
}
//
// ParseConfig - Read the CISTPL_CONFIG tuple from the CIS and format it into a
// PARSED_CONFIG structure.
//
#define BUFFER_SIZE 0x200
STATUS
ParseConfig(CARD_SOCKET_HANDLE hSocket, PVOID pBuf, PUINT pnItems )
{
if(pBuf == NULL || pnItems == NULL)
return CERR_BAD_ARGS;
STATUS status;
PPARSED_CONFIG pCfg = (PPARSED_CONFIG)pBuf;
UCHAR buf[BUFFER_SIZE + sizeof(CARD_DATA_PARMS)];
PCARD_DATA_PARMS pData;
PCARD_TUPLE_PARMS pTuple;
PUCHAR pCIS;
UINT AddrSz;
//
// Find and read the second CISTPL_CONFIG tuple if possible.
// (Some MFC cards contain a CISTPL_CONFIG in the CISTPL_LONGLINK_MFC chain)
//
pTuple = (PCARD_TUPLE_PARMS)buf;
pTuple->hSocket = hSocket;
pTuple->uDesiredTuple = CISTPL_CONFIG;
pTuple->fAttributes = 0; // Not interested in links
status = CardGetFirstTuple(pTuple);
if (status) {
DEBUGMSG(ZONE_WARNING, (TEXT("ParseConfig: CardGetFirstTuple returned %d\r\n"), status));
*pnItems = 0;
return status;
}
status = CardGetNextTuple(pTuple);
if (status) {
status = CardGetFirstTuple(pTuple);
if (status) {
DEBUGMSG(ZONE_WARNING, (TEXT("ParseConfig: CardGetFirstTuple returned %d\r\n"), status));
*pnItems = 0;
return status;
}
}
pData = (PCARD_DATA_PARMS)buf;
pData->uBufLen = BUFFER_SIZE;
pData->uTupleOffset = 0;
status = CardGetTupleData(pData);
if (status) {
DEBUGMSG(ZONE_WARNING, (TEXT("ParseConfig: CardGetTupleData returned %d\r\n"), status));
*pnItems = 0;
return status;
}
if (pBuf == NULL) {
*pnItems = 1;
return CERR_SUCCESS;
}
if (*pnItems == 0) {
return CERR_BAD_ARG_LENGTH;
}
*pnItems = 1;
pCfg->ConfigBase = 0;
pCfg->RegMask = 0;
pCIS = buf + sizeof(CARD_DATA_PARMS);
AddrSz = (*pCIS & 0x03) + 1;
pCIS++;
pCfg->LastConfigIndex = *pCIS & 0x3f;
pCIS++;
//
// Read the configuration register offset address and leave it in real
// physical address units.
//
pCfg->ConfigBase = VarToFixed(
AddrSz,
pCIS); // pointer
//
// Now get the register presence mask (only the first byte)
//
pCfg->RegMask = pCIS[AddrSz];
DEBUGMSG(ZONE_FUNCTION,
(TEXT("ParseConfig: Last configuration index = 0x%x\r\n"), pCfg->LastConfigIndex));
DEBUGMSG(ZONE_FUNCTION,
(TEXT("ParseConfig: Config registers base = 0x%x\r\n"), pCfg->ConfigBase));
DEBUGMSG(ZONE_FUNCTION,
(TEXT("ParseConfig: Register presence mask = 0x%x\r\n"), pCfg->RegMask));
return CERR_SUCCESS;
} // ParseConfig
//
// VarToFixed - convert the bytes of a variable length field into a UINT32
// and return fixed length value.
//
UINT32 VarToFixed(UINT32 VarSize, PUCHAR pBytes)
{
if(pBytes == NULL)
return CERR_BAD_ARGS;
UINT32 Fixed = 0;
//
// Parse the bytes starting from the MSB and shift them into place.
//
while (VarSize) {
VarSize--;
Fixed <<= 8;
Fixed |= (UINT32) pBytes[VarSize];
}
return Fixed;
}
STATUS ParseCfTable(CARD_SOCKET_HANDLE hSocket, PVOID pBuf,PUINT pnItems )
{
if(pnItems == NULL)
return CERR_BAD_ARGS;
STATUS status;
UCHAR buf[BUFFER_SIZE + sizeof(CARD_DATA_PARMS)];
PCARD_DATA_PARMS pData;
PCARD_TUPLE_PARMS pTuple;
PUCHAR pCIS;
PUCHAR pTmp;
PPARSED_PCMCFTABLE pCfTable = (PPARSED_PCMCFTABLE)pBuf;
PPARSED_PCMCFTABLE pCfDefault = NULL;
BOOL TimingPresent; // This tuple contains a description of the card's timing
BOOL IOPresent; // This tuple contains I/O descriptor bytes
DWORD bmPowerPresent; // This tuple has some power descriptors
int lastCFI = -1; // Configuration Index of the previous CFTABLE_ENTRY tuple
INT i;
UINT nItems;
DWORD dwLen;
BYTE IrqPresent, MemPresent;
nItems = 0;
//
// Find the first CISTPL_CFTABLE_ENTRY tuple
//
pTuple = (PCARD_TUPLE_PARMS)buf;
pTuple->hSocket = hSocket;
pTuple->uDesiredTuple = CISTPL_CFTABLE_ENTRY;
pTuple->fAttributes = 0; // Not interested in links
status = CardGetFirstTuple(pTuple);
if (status) {
DEBUGMSG(ZONE_WARNING,
(TEXT("ParseCfTable: CardGetFirstTuple returned %d\r\n"), status));
goto pcft_exit;
}
if (pBuf != NULL) {
if (*pnItems == 0) {
status = CERR_BAD_ARG_LENGTH;
} else {
memset(pBuf, 0, *pnItems * sizeof(PARSED_CFTABLE));
}
}
//
// Parse all the CISTPL_CFTABLE_ENTRYs or as many as fit in the user's buffer
//
while (status == CERR_SUCCESS) {
nItems++;
if (pBuf == NULL) {
goto pcft_next;
}
pData = (PCARD_DATA_PARMS)buf;
pData->uBufLen = BUFFER_SIZE;
pData->uTupleOffset = 0;
status = CardGetTupleData(pData);
if (status) {
DEBUGMSG(ZONE_WARNING,
(TEXT("ParseCfTable: CardGetTupleData returned %d\r\n"), status));
goto pcft_exit;
}
dwLen= min(BUFFER_SIZE-sizeof(CARD_DATA_PARMS),pData->uDataLen);
//
// Parse this CISTPL_CFTABLE_ENTRY
//
pCIS = buf + sizeof(CARD_DATA_PARMS);
// Default all the fields of the current parsed entry if necessary
//
// !! The ContainsDefaults field is now deprecated and should be
// !! set to non-zero in every parsed entry.
//
pCfTable->ContainsDefaults = *pCIS & 0x40;
pCfTable->ConfigIndex = *pCIS & 0x3F;
if (pCfTable->ContainsDefaults)
pCfDefault = pCfTable;
else if (pCfTable->ConfigIndex == lastCFI) {
ASSERT(pCfTable != pBuf && lastCFI >= 0);
*pCfTable = *(pCfTable - 1);
pCfTable->ContainsDefaults = TRUE;
} else if (pCfDefault)
*pCfTable = *pCfDefault;
// Reset the ConfigIndex after defaulting
pCfTable->ConfigIndex = *pCIS & 0x3F;
lastCFI = pCfTable->ConfigIndex;
// lastCFI is not used beyond this point
//
// Parse the interface type byte if present
//
if (*pCIS & 0x80) {
pCIS++;
if (dwLen--==0) goto pcft_continue;
pCfTable->IFacePresent = TRUE;
pCfTable->IFaceType = *pCIS & 0x0F;
pCfTable->BVDActive = *pCIS & 0x10;
pCfTable->WPActive = *pCIS & 0x20;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -