home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 January (DVD)
/
VPR980100.ISO
/
DRIVER
/
IBM
/
VW200
/
VW200_2.EXE
/
CHIPUTL
/
CHIPUTL.C
next >
Wrap
Text File
|
1996-03-07
|
20KB
|
546 lines
// ============================================================================
//
// IBM DOS ChipCardドライバー・ユティリティー
//
//
// (C) Copyright IBM Corporation 1995, 1996
//
// DISCLAIMER OF WARRANTIES. The following [enclosed] code is provided
// to you solely for the purpose of assisting you in the development of
// your applications. The code is provided "AS IS", without warranty of
// any kind. IBM shall not be liable for any damages arising out of your
// use of this code, even if they have been advised of the possibility
// of such damages.
//
// Module Name: CHIPUTL.C
// Date : 3/7/95
// Version : 2.01
//
// ============================================================================
unsigned short OpenChipDrv( );
unsigned short CloseChipDrv( );
unsigned short Request2ChipDrv( );
// ChipCardドライバーへのコマンド
#define GET_CARD_INFORMATION 1 // カード情報の取得
#define READ_WRITE_SRAM 2 // SRAM/EEPROMへの読み書き
#define GET_CARD_INFORMATION2 3 // カード情報の取得 2
#define CHIPCARD_COMMAND 4 // ChipCardコマンド
// ChipCardドライバーへのサブコマンド
#define READ_SRAM 1 // SRAM/EEPROMからの読み込み
#define WRITE_SRAM 2 // SRAM/EEPROMへの書き込み
#define POWER_ON 1 // 電源オン
#define POWER_OFF 2 // 電源オフ
#define CHIPCARD_TC100 1 // ChipCard TC-100
#define CHIPCARD_VW200 2 // ChipCard VW-200
// ----------------------------------------------------------------------------
// 汎用IOCtl構造体
// ----------------------------------------------------------------------------
// カード情報の取得
struct
{
unsigned short Socket; // 挿入されているソケットの番号
unsigned char CardType; // ChipCardタイプ
unsigned char Flag; // フラグ
unsigned short WinHandle; // ウィンドウ・ハンドル
unsigned long Base; // メモリーウィンドウのベースアドレス
unsigned long Size; // メモリーウィンドウのサイズ
unsigned long EndOffset; // SRAM領域の終わりのアドレス
unsigned short Function; // ファンクション番号
unsigned short Error; // 戻りコード
} CardInformation, *CI;
// フラグ
#define CARD_INFO2_EXIST 0x80 // カード情報の取得 2 あり
// SRAM/EEPROMへの読み書き
struct
{
unsigned char Command; // サブコマンド
unsigned long Buffer; // ユーザーバッファへのポインター
unsigned long Offset; // カード内のアドレス
unsigned short Size; // リクエスト転送サイズ
unsigned short ActualSize; // 実転送サイズ
unsigned short Return; // 戻りコード
} AccessSram, *AS;
// カード情報の取得 2
struct
{
unsigned char Number; // カード情報番号
unsigned long StartAddress1; // 開始アドレス
unsigned long Size1; // サイズ
unsigned char DeviceType1; // デバイス・タイプ
unsigned short Return; // 戻りコード
} CardInformation2, *CI2;
// ChipCardコマンド
struct
{
unsigned char Command;
} CC_Command, *CCC;
unsigned char CSXX[] = "未定義ファンクション";
unsigned char CS04[] = "GetConfigurationInfo";
unsigned char CS07[] = "GetFirstTuple ";
unsigned char CS0A[] = "GetNextTuple ";
unsigned char CS0B[] = "GetCardServicesInfo ";
unsigned char CS0C[] = "GetStatus ";
unsigned char CS0D[] = "GetTupleData ";
unsigned char CS10[] = "RegisterClient ";
unsigned char CS14[] = "MapMemPage ";
unsigned char CS1B[] = "ReleaseIO ";
unsigned char CS1C[] = "ReleaseIRQ ";
unsigned char CS1D[] = "ReleaseWindow ";
unsigned char CS1E[] = "ReleaseConfiguration";
unsigned char CS1F[] = "RequestIO ";
unsigned char CS20[] = "RequestIRQ ";
unsigned char CS21[] = "RequestWindow ";
unsigned char CS30[] = "RequestConfiguration";
unsigned char *CS_FUNC[0x31] =
{
CSXX,CSXX,CSXX,CSXX,CS04,CSXX,CSXX,CS07,
CSXX,CSXX,CS0A,CS0B,CS0C,CS0D,CSXX,CSXX,
CS10,CSXX,CSXX,CSXX,CS14,CSXX,CSXX,CSXX,
CSXX,CSXX,CSXX,CS1B,CS1C,CS1D,CS1E,CS1F,
CS20,CS21,CSXX,CSXX,CSXX,CSXX,CSXX,CSXX,
CSXX,CSXX,CSXX,CSXX,CSXX,CSXX,CSXX,CSXX,
CS30
};
unsigned char ERRXX[] = "未定義の戻りコード ";
unsigned char ERR00[] = "正常終了 ";
unsigned char ERR01[] = "アダプターが無効 ";
unsigned char ERR02[] = "属性が無効 ";
unsigned char ERR03[] = "ベースアドレスが無効";
unsigned char ERR04[] = "EDCが無効 ";
unsigned char ERR06[] = "IRQが無効 ";
unsigned char ERR07[] = "オフセットが無効 ";
unsigned char ERR08[] = "ページが無効 ";
unsigned char ERR09[] = "読み取りエラー ";
unsigned char ERR0A[] = "サイズが無効 ";
unsigned char ERR0B[] = "ソケットが無効 ";
unsigned char ERR0D[] = "タイプが無効 ";
unsigned char ERR0E[] = "Vccが無効 ";
unsigned char ERR0F[] = "Vppが無効 ";
unsigned char ERR11[] = "ウィンドウが無効 ";
unsigned char ERR12[] = "書き込みエラー ";
unsigned char ERR14[] = "PCカードが存在しない";
unsigned char ERR15[] = "サポートされていないファンクション";
unsigned char ERR16[] = "サポートされていないモード ";
unsigned char ERR17[] = "速度が無効 ";
unsigned char ERR18[] = "実行中(ビジィ) ";
unsigned char ERR19[] = "一般エラー ";
unsigned char ERR1A[] = "ライト・プロテクト ";
unsigned char ERR1B[] = "引数の長さが無効 ";
unsigned char ERR1C[] = "引数が無効 ";
unsigned char ERR1D[] = "コンフィグレーションが解放されていない";
unsigned char ERR1E[] = "すでに使用されている";
unsigned char ERR1F[] = "項目がない ";
unsigned char ERR20[] = "リソース外 ";
unsigned char ERR21[] = "ハンドルが無効 ";
unsigned char *CS_ERR[0x22] =
{
ERR00,ERR01,ERR02,ERR03,ERR04,ERRXX,ERR06,ERR07,
ERR08,ERR09,ERR0A,ERR0B,ERRXX,ERR0D,ERR0E,ERR0F,
ERRXX,ERR11,ERR12,ERRXX,ERR14,ERR15,ERR16,ERR17,
ERR18,ERR19,ERR1A,ERR1B,ERR1C,ERR1D,ERR1E,ERR1F,
ERR20,ERR21
};
unsigned char AC00[] = "ChipCardドライバー・ファンクション";
unsigned char ERRZ0[] = "正常終了 ";
unsigned char ERRZ1[] = "サポートしていないPCカードです";
unsigned char ERRZ2[] = "すでにイネーブルされています ";
unsigned char ERRZ3[] = "ChipCardは使用中です ";
unsigned char *AC_ERR[4] =
{
ERRZ0,ERRZ1,ERRZ2,ERRZ3
};
unsigned char ERRS0[] = "正常終了 ";
unsigned char ERRS1[] = "コマンドの誤り ";
unsigned char ERRS2[] = "CS MapMemPageのエラー ";
unsigned char ERRS3[] = "不適切なオフセットが指定されました";
unsigned char ERRS4[] = "不適切なサイズが指定されました ";
unsigned char ERRS5[] = "SRAMの終わり ";
unsigned char ERRS6[] = "DevHlp Lockのエラー "; // OS/2のみ
unsigned char ERRS7[] = "DevHlp PhysToVirtのエラー "; // OS/2のみ
unsigned char ERRS8[] = "EEPROMへの書き込みのエラー ";
unsigned char *AS_ERR[9] =
{
ERRS0,ERRS1,ERRS2,ERRS3,ERRS4,ERRS5,ERRS6,ERRS7,ERRS8
};
unsigned char CHIP0[] = "不明なPCカード ";
unsigned char CHIP1[] = "ChipCard TC-100";
unsigned char CHIP2[] = "ChipCard VW-200";
unsigned char *CC_TYPE[3] =
{
CHIP0,CHIP1,CHIP2
};
unsigned char DEV0[] = " ";
unsigned char DEV1[] = "SRAM ";
unsigned char DEV2[] = "EEPROM";
unsigned char *CC_DEV[3] =
{
DEV0,DEV1,DEV2
};
unsigned char CI200[] = "正常終了 ";
unsigned char CI201[] = "カード情報番号の誤り";
unsigned char *CI2_ERR[2] =
{
CI200,CI201
};
#define BUFFER_SIZE 0x2000
unsigned long Offset;
unsigned short Size;
unsigned char Buffer[BUFFER_SIZE] = { 0 };
main( )
{
unsigned short handle;
unsigned short cmd = 0;
unsigned short key = 0;
unsigned short skt;
unsigned short err;
unsigned short i;
unsigned short j;
unsigned short k;
unsigned char far *p;
// ------------------------------------------------------------------------
// プログラム名/バージョンの表示
// ------------------------------------------------------------------------
printf( "\n" );
printf( "IBM DOS ChipCardドライバー・ユーティリティー V2.01 \n" );
printf( "(C) Copyright IBM Corporation 1995, 1996. All rights reserved. \n\n" );
// ------------------------------------------------------------------------
// ChipCardドライバーのオープン
// ------------------------------------------------------------------------
handle = OpenChipDrv( );
if ( handle == 0 )
printf( "オープン・エラー: ハンドル = %X \n\n", handle );
// ------------------------------------------------------------------------
// メイン・メニューの表示
// ------------------------------------------------------------------------
while( 1 )
{
printf( "1. カード情報の取得 \n" );
printf( "2. SRAM/EEPROMへの読み書き \n" );
printf( "3. カード情報の取得 2 \n" );
printf( "4. ChipCardコマンド \n" );
printf( "9. 終了 \n" );
printf( "コマンド番号 = " ); scanf( "%d", &cmd );
printf( "\n" );
if ( cmd == 9 ) break;
if ( ( cmd < 1 ) || ( cmd > 4 ) ) break;
switch( cmd )
{
case GET_CARD_INFORMATION:
printf( "**** カード情報の取得 **** \n" );
CI = &CardInformation;
err = Request2ChipDrv( handle, cmd, CI );
printf( "ソケット = %X \n", CI->Socket );
printf( "ChipCardの種類 = %s \n", CC_TYPE[CI->CardType]); // #25
printf( "フラグ = %X \n", CI->Flag ); // #20
printf( "ベースアドレス = %lXh \n", CI->Base );
printf( "ウィンドウのサイズ = %dKB \n", (CI->Size)/1024 );
printf( "SRAM領域の終わり = %ldKB \n", (CI->EndOffset)/1024 ); // #01
if ( ( CI->Function & 0xFF00 ) == 0xAF00 )
{
printf( "ファンクション = %s \n", CS_FUNC[CI->Function-0xAF00] );
printf( "戻りコード = %s \n", CS_ERR[CI->Error] );
}
else if ( ( CI->Function & 0xFF00 ) == 0xAC00 )
{
printf( "ファンクション = %s \n", AC00 );
printf( "戻りコード = %s \n", AC_ERR[CI->Error] );
}
else
{
printf( "ファンクション = %X \n", CI->Function );
printf( "戻りコード = %X \n", CI->Error );
}
if ( err )
printf( "エラー: エラー = %X \n", err );
break;
case READ_WRITE_SRAM:
printf( "**** SRAM/EEPROMへの読み書き **** \n" );
printf( "1. 読み込み \n" );
printf( "2. 書き込み \n" );
printf( "9. 終了 \n" );
printf( "コマンド番号 = " ); scanf( "%d", &key );
printf( "\n" );
if ( key == 9 ) break;
if ( ( key < 1 ) || ( key > 2 ) ) break;
for ( i = 0; i < BUFFER_SIZE; ++i ) Buffer[i] = 0x20;
AS = &AccessSram;
AS->Command = (char) key;
switch( key )
{
case READ_SRAM:
p = (unsigned char far *) Buffer;
AS->Buffer = (unsigned long) p;
Offset = 0;
Size = 0;
printf( "カード・オフセット (16進) = " ); scanf( "%lx", &Offset );
AS->Offset = Offset;
printf( "読み込みサイズ = " ); scanf( "%d", &Size );
AS->Size = Size;
break;
case WRITE_SRAM:
printf( "ユーザー・バッファ = " ); scanf( "%s", Buffer );
p = (unsigned char far *) Buffer;
AS->Buffer = (unsigned long) p;
Offset = 0;
Size = 0;
printf( "カード・オフセット (16進) = " ); scanf( "%lx", &Offset );
AS->Offset = Offset;
printf( "書き込みサイズ = " ); scanf( "%d", &Size );
AS->Size = Size;
break;
}
err = Request2ChipDrv( handle, cmd, AS );
switch( key )
{
case READ_SRAM:
printf( "ユーザー・バッファ = \n" );
for ( i = 0; i < AS->ActualSize; i += 16 )
{
for ( j = i; ( j < AS->ActualSize ) && ( j - i < 16 ); ++j )
{
printf( "%02X ", Buffer[j] );
}
k = 16 - ( j - i );
if ( k != 0 )
for ( j = 0; j < k; ++j ) printf( " " );
printf( " " );
for ( j = i; ( j < AS->ActualSize ) && ( j - i < 16 ); ++j )
{
printf( "%c", Buffer[j] );
}
printf( "\n" );
}
printf( "実サイズ = %d \n", AS->ActualSize );
break;
case WRITE_SRAM:
printf( "実サイズ = %d \n", AS->ActualSize );
break;
}
printf( "戻りコード = %s \n", AS_ERR[AS->Return] );
break;
case GET_CARD_INFORMATION2:
printf( "**** カード情報の取得 2 **** \n" );
CI = &CardInformation;
err = Request2ChipDrv( handle, GET_CARD_INFORMATION, CI );
if ( err )
{
printf( "エラー: エラー = %X \n", err );
break;
}
i = (unsigned short) ( CI->Flag & 0x07 );
if ( i == 0 )
{
printf( "カード情報 2 がありません \n" );
break;
}
CI2 = &CardInformation2;
for ( j = 1; j <= i; ++j )
{
CI2->Number = j;
err = Request2ChipDrv( handle, cmd, CI2 );
printf( "開始アドレス = %lXh \n", CI2->StartAddress1 );
printf( "サイズ = %dKB \n", (CI2->Size1)/1024 );
printf( "デバイス・タイプ = %s \n", CC_DEV[CI2->DeviceType1] );
printf( "戻りコード = %s \n", CI2_ERR[CI2->Return] );
}
break;
case CHIPCARD_COMMAND:
printf( "**** ChipCardコマンド **** \n" );
printf( "1. 電源オン \n" );
printf( "2. 電源オフ \n" );
printf( "3. EEPROMのプロテクト・オン \n" );
printf( "4. EEPROMのプロテクト・オフ \n" );
printf( "9. 終了 \n" );
printf( "コマンド番号 = " ); scanf( "%d", &key );
printf( "\n" );
if ( key == 9 ) break;
if ( ( key < 1 ) || ( key > 4 ) ) break;
CCC = &CC_Command;
CCC->Command = (char) key;
err = Request2ChipDrv( handle, cmd, CCC );
break;
}
printf( "\n" );
}
// ------------------------------------------------------------------------
// ChipCardドライバーのクローズ
// ------------------------------------------------------------------------
err = CloseChipDrv( handle );
if ( err )
printf( "クローズ・エラー: エラー = %X \n", err );
}
// ----------------------------------------------------------------------------
//
// ChipCardドライバーのオープン
//
// ----------------------------------------------------------------------------
unsigned short OpenChipDrv( )
{
unsigned short handle;
unsigned char name[9] = "$CHIP ";
unsigned char near *np;
name[8] = 0;
np = name;
_asm
{
push ax
push dx
push ds
mov ax, ss
mov ds, ax
mov dx, np
mov ax, 3D02h
int 21h
jc err_open
mov handle, ax
jmp end_open
err_open:
xor ax, ax
mov handle, ax
end_open:
pop ds
pop dx
pop ax
}
return( handle );
}
// ----------------------------------------------------------------------------
//
// ChipCardドライバーのクローズ
//
// ----------------------------------------------------------------------------
unsigned short CloseChipDrv( unsigned short handle )
{
unsigned short err;
_asm
{
push ax
push bx
mov ah, 3Eh
mov bx, handle
int 21h
jc err_close
xor ax, ax
err_close:
mov err, ax
pop bx
pop ax
}
return( err );
}
// ----------------------------------------------------------------------------
//
// ChipCardドライバーへのリクエスト
//
// ----------------------------------------------------------------------------
unsigned short Request2ChipDrv( handle, cmd, pkt )
unsigned short handle;
unsigned short cmd;
unsigned char *pkt;
{
unsigned short err;
_asm
{
push ax
push bx
push cx
push dx
mov ax, 440Ch
mov bx, handle
mov ch, 0ACh
mov cl, cmd
mov dx, pkt
int 21h
jc err_ioctl
xor ax, ax
err_ioctl:
mov err, ax
pop dx
pop cx
pop bx
pop ax
}
return( err );
}