📄 common.cpp
字号:
LPTSTR
FindStatusName( STATUS StatusCode)
{
if(StatusCode < 0 || StatusCode > 0x23) //invalid code
return NULL;
return RtnCodes[StatusCode];
}
// --------------------- update error code -----------
void updateError (UINT n)
{ // n arbitrary
if (n > 5) return ; // 0 <= n <= 5
if (n == TST_NO_ERROR) {return ;} // 1 <= n <= 5
if (LastError == TST_NO_ERROR) {LastError = n ; return ;} // First error
if (n < LastError) {LastError = n ; return ;} // n no worse
}
BOOL NormalRequestConfig(CARD_CLIENT_HANDLE hClient, UINT8 uSock, UINT8 uFunc){
CARD_CONFIG_INFO confInfo = {0};
STATUS status = CERR_SUCCESS;
CARD_SOCKET_HANDLE hSocket = {uSock, uFunc};
UINT32 uParsedItems = 0;
UINT32 uParsedSize = 0;
PVOID parsedBuf;
if(CardGetParsedTuple(hSocket, CISTPL_CFTABLE_ENTRY_CB, 0, &uParsedItems) != CERR_SUCCESS){
DEBUGMSG(ZONE_ERROR, (TEXT("CardGetParsedTuple call failed")));
return FALSE;
}
uParsedSize = uParsedItems * sizeof (PARSED_CBCFTABLE) ;
if (uParsedSize){
parsedBuf = new UCHAR [uParsedSize] ;
if (parsedBuf){
CardGetParsedTuple(hSocket, CISTPL_CFTABLE_ENTRY_CB, parsedBuf, &uParsedItems);
}
else{
return FALSE;
}
}
else{
DEBUGMSG(ZONE_ERROR, (TEXT("no config table entry found")));
return FALSE;
}
PVOID pCur = parsedBuf;
PARSED_CBCFTABLE* pTable = NULL;
BOOL bConfigured = FALSE;
for(UINT i = 0; i < uParsedItems; i++){
pTable = (PARSED_CBCFTABLE *)pCur;
confInfo.hSocket.uFunction = uFunc;
confInfo.hSocket.uSocket = uSock;
//calling CardRequestCOnfiguration using normal parameters
confInfo.uVcc=((pTable->VccDescr.ValidMask &1)?(UINT8)pTable->VccDescr.NominalV:(UINT)-1);
confInfo.uVpp1=((pTable->Vpp1Descr.ValidMask &1)?(UINT8)pTable->Vpp1Descr.NominalV:(UINT)-1);
confInfo.uVpp2=((pTable->Vpp2Descr.ValidMask &1)?(UINT8)pTable->Vpp2Descr.NominalV:(UINT)-1);
//now request configuration
status = CardRequestConfiguration(hClient, &confInfo);
if(status == CERR_SUCCESS){//configure succeeded
bConfigured = TRUE;
break;
}
pCur = (PBYTE)pCur + sizeof(PARSED_CBCFTABLE);
}
if(bConfigured == FALSE){
g_pKato->Log(LOG_FAIL,TEXT("Socket %u: requestconfiguration failed!\r\n"), uSock);
}
delete[] parsedBuf;
return bConfigured;
}
BOOL RetrieveRegisterValues(PCARD_CONFIG_INFO pConfInfo, CARD_SOCKET_HANDLE hSocket){
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_FUNCTION, (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_CB:
status = ParseCfTable(hSocket, pBuf, pnItems);
break;
default:
status = CERR_BAD_ARGS;
break;
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
status=CERR_BAD_HANDLE;
}
}
if (status) {
DEBUGMSG(ZONE_FUNCTION|ZONE_ERROR,(TEXT("CardGetParsedTuple failed %d\r\n"), status));
} else {
DEBUGMSG(ZONE_FUNCTION, (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
#define PCI_CONFIG_CARDBUS_CIS (10 << 2)
#define PCI_CONFIG_BASE0 (4 << 2)
STATUS ParseConfig(CARD_SOCKET_HANDLE hSocket, PVOID pBuf, PUINT pnItems )
{
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)
{
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 )
{
STATUS status;
UCHAR buf[BUFFER_SIZE + sizeof(CARD_DATA_PARMS)];
PCARD_DATA_PARMS pData;
PCARD_TUPLE_PARMS pTuple;
PUCHAR pCIS;
PPARSED_CBCFTABLE pCfTable = (PPARSED_CBCFTABLE)pBuf;
PPARSED_CBCFTABLE pCfDefault = NULL;
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, MiscPresent;
nItems = 0;
//
// Find the first CISTPL_CFTABLE_ENTRY tuple
//
pTuple = (PCARD_TUPLE_PARMS)buf;
pTuple->hSocket = hSocket;
pTuple->uDesiredTuple = CISTPL_CFTABLE_ENTRY_CB;
pTuple->fAttributes = 0; // Not interested in links
status = CardGetFirstTuple(pTuple);
if (status) {//use default instead
nItems = 1;
if(pBuf){
CreateDefaultInfo(hSocket, (PPARSED_CBCFTABLE)pBuf);
}
status = CERR_SUCCESS;
goto pcft_exit;
}
if (pBuf != NULL) {
if (*pnItems == 0) {
status = CERR_BAD_ARG_LENGTH;
} else {
memset(pBuf, 0, *pnItems * sizeof(PARSED_CBCFTABLE));
}
}
//
// 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
pCIS++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -