You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
282 lines
5.9 KiB
282 lines
5.9 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: ifdmsg.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <conio.h>
|
|
|
|
#include <afx.h>
|
|
#include <afxtempl.h>
|
|
|
|
#include <winioctl.h>
|
|
#include <winsmcrd.h>
|
|
|
|
#include "ifdtest.h"
|
|
|
|
// Our log file
|
|
static FILE *g_pLogFile;
|
|
|
|
// These are used by the Testxxx functions
|
|
static BOOL g_bTestFailed;
|
|
static BOOL g_bReaderFailed;
|
|
static BOOL g_bTestStart;
|
|
|
|
void
|
|
LogOpen(
|
|
PCHAR in_pchFileName
|
|
)
|
|
{
|
|
CHAR l_rgchFileName[128];
|
|
|
|
sprintf(l_rgchFileName, "%s.log", in_pchFileName);
|
|
g_pLogFile = fopen(l_rgchFileName, "w");
|
|
}
|
|
|
|
void
|
|
LogMessage(
|
|
PCHAR in_pchFormat,
|
|
...
|
|
)
|
|
{
|
|
CHAR l_rgchBuffer[128];
|
|
va_list l_pArg;
|
|
|
|
va_start(
|
|
l_pArg,
|
|
in_pchFormat
|
|
);
|
|
|
|
vsprintf(
|
|
l_rgchBuffer,
|
|
in_pchFormat,
|
|
l_pArg
|
|
);
|
|
|
|
printf("%s\n", l_rgchBuffer);
|
|
if (g_pLogFile) {
|
|
|
|
fprintf(g_pLogFile, "%s\n", l_rgchBuffer);
|
|
}
|
|
}
|
|
|
|
void
|
|
TestStart(
|
|
PCHAR in_pchFormat,
|
|
...
|
|
)
|
|
{
|
|
CHAR l_rgchBuffer[128];
|
|
va_list l_pArg;
|
|
|
|
if (g_bTestStart) {
|
|
|
|
printf("\n*** WARNING: Missing TestResult() call\n");
|
|
}
|
|
|
|
g_bTestStart = TRUE;
|
|
g_bTestFailed = FALSE;
|
|
|
|
va_start(l_pArg, in_pchFormat);
|
|
vsprintf(l_rgchBuffer, in_pchFormat, l_pArg);
|
|
|
|
printf(" %-50s", l_rgchBuffer);
|
|
if (g_pLogFile) {
|
|
|
|
fprintf(g_pLogFile, " %-50s", l_rgchBuffer);
|
|
}
|
|
}
|
|
|
|
static
|
|
void
|
|
TestMsg(
|
|
BOOL in_bTestEnd,
|
|
BOOL in_bTestResult,
|
|
PCHAR in_pchFormat,
|
|
va_list in_pArg
|
|
)
|
|
{
|
|
CHAR l_rgchBuffer[2048];
|
|
|
|
if (in_bTestEnd && g_bTestStart == FALSE) {
|
|
|
|
printf("\n*** WARNING: Missing TestStart() call\n");
|
|
}
|
|
|
|
vsprintf(l_rgchBuffer, in_pchFormat, in_pArg);
|
|
|
|
if (in_bTestResult == FALSE && g_bTestFailed == FALSE) {
|
|
|
|
g_bTestFailed = TRUE;
|
|
g_bReaderFailed = TRUE;
|
|
printf("* FAILED\n- %s\n", l_rgchBuffer);
|
|
|
|
if (g_pLogFile) {
|
|
|
|
fprintf(g_pLogFile, "* FAILED\n- %s\n", l_rgchBuffer);
|
|
}
|
|
}
|
|
|
|
if (in_bTestEnd) {
|
|
|
|
if (g_bTestFailed != TRUE) {
|
|
|
|
printf(" Passed\n");
|
|
|
|
if (g_pLogFile) {
|
|
|
|
fprintf(g_pLogFile, " Passed\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
TestCheck(
|
|
BOOL in_bResult,
|
|
PCHAR in_pchFormat,
|
|
...
|
|
)
|
|
{
|
|
va_list l_pArg;
|
|
|
|
va_start(l_pArg, in_pchFormat);
|
|
TestMsg(FALSE, in_bResult, in_pchFormat, l_pArg);
|
|
}
|
|
|
|
void
|
|
TestCheck(
|
|
ULONG in_lResult,
|
|
const PCHAR in_pchOperator,
|
|
const ULONG in_uExpectedResult,
|
|
ULONG in_uResultLength,
|
|
ULONG in_uExpectedLength,
|
|
UCHAR in_chSw1,
|
|
UCHAR in_chSw2,
|
|
UCHAR in_chExpectedSw1,
|
|
UCHAR in_chExpectedSw2,
|
|
PUCHAR in_pchData,
|
|
PUCHAR in_pchExpectedData,
|
|
ULONG in_uDataLength
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function checks the return code, the number of bytes
|
|
returned, the card status bytes and the data returned by
|
|
a call to CReader::Transmit.
|
|
|
|
--*/
|
|
{
|
|
if (strcmp(in_pchOperator, "==") == 0 &&
|
|
in_lResult != in_uExpectedResult ||
|
|
strcmp(in_pchOperator, "!=") == 0 &&
|
|
in_lResult == in_uExpectedResult) {
|
|
|
|
TestCheck(
|
|
FALSE,
|
|
"IOCTL call failed:\nReturned %8lxH (NTSTATUS %8lxH)\nExpected %s%8lxH (NTSTATUS %8lxH)",
|
|
in_lResult,
|
|
MapWinErrorToNtStatus(in_lResult),
|
|
(strcmp(in_pchOperator, "!=") == 0 ? "NOT " : ""),
|
|
in_uExpectedResult,
|
|
MapWinErrorToNtStatus(in_uExpectedResult)
|
|
);
|
|
|
|
} else if (in_uResultLength != in_uExpectedLength) {
|
|
|
|
TestCheck(
|
|
FALSE,
|
|
"IOCTL returned wrong number of bytes:\nReturned %3ld bytes\nExpected %3ld bytes",
|
|
in_uResultLength,
|
|
in_uExpectedLength
|
|
);
|
|
|
|
} else if (in_chSw1 != in_chExpectedSw1 ||
|
|
in_chSw2 != in_chExpectedSw2){
|
|
|
|
TestCheck(
|
|
FALSE,
|
|
"Card returned wrong status:\nStatus SW1 = %02x SW2 = %02x\nExpected SW1 = %02x SW2 = %02x",
|
|
in_chSw1,
|
|
in_chSw2,
|
|
in_chExpectedSw1,
|
|
in_chExpectedSw2
|
|
);
|
|
|
|
} else if (memcmp(in_pchData, in_pchExpectedData, in_uDataLength)) {
|
|
|
|
CHAR l_rgchData[2048], l_rgchExpectedData[2048];
|
|
|
|
for (ULONG i = 0; i < in_uDataLength; i++) {
|
|
|
|
sprintf(l_rgchData + i * 3, "%02X ", in_pchData[i]);
|
|
sprintf(l_rgchExpectedData + i * 3, "%02X ", in_pchExpectedData[i]);
|
|
|
|
if ((i + 1) % 24 == 0) {
|
|
|
|
l_rgchData[i * 3 + 2] = '\n';
|
|
l_rgchExpectedData[i * 3 + 2] = '\n';
|
|
}
|
|
}
|
|
|
|
TestCheck(
|
|
FALSE,
|
|
"IOCTL returned incorrect data:\nData returned:\n%s\nExpected data:\n%s",
|
|
l_rgchData,
|
|
l_rgchExpectedData
|
|
);
|
|
}
|
|
}
|
|
|
|
void
|
|
TestEnd(
|
|
void
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
A call to this function marks the end of a test sequence.
|
|
A sequence is usually look like:
|
|
|
|
TestStart(Message)
|
|
CReaderTransmit or DeviceIoControl
|
|
TestCheck(...)
|
|
TestEnd()
|
|
|
|
--*/
|
|
{
|
|
#ifdef _M_ALPHA
|
|
va_list l_pArg;
|
|
#else
|
|
va_list l_pArg = NULL;
|
|
#endif
|
|
TestMsg(TRUE, TRUE, "", l_pArg);
|
|
g_bTestStart = FALSE;
|
|
}
|
|
|
|
BOOL
|
|
TestFailed(
|
|
void
|
|
)
|
|
{
|
|
return g_bTestFailed;
|
|
}
|
|
|
|
BOOL
|
|
ReaderFailed(
|
|
void
|
|
)
|
|
{
|
|
return g_bReaderFailed;
|
|
}
|
|
|