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 >
Text File  |  1996-03-07  |  20KB  |  546 lines

  1. // ============================================================================
  2. //
  3. //     IBM DOS ChipCardドライバー・ユティリティー
  4. //
  5. //
  6. //     (C) Copyright IBM Corporation 1995, 1996
  7. //
  8. //     DISCLAIMER OF WARRANTIES.  The following [enclosed] code is provided
  9. //     to you solely for the purpose of assisting you in the development of
  10. //     your applications. The code is provided "AS IS", without warranty of
  11. //     any kind. IBM shall not be liable for any damages arising out of your
  12. //     use of this code, even if they have been advised of the possibility
  13. //     of such damages.
  14. //
  15. //     Module Name: CHIPUTL.C
  16. //     Date       : 3/7/95
  17. //     Version    : 2.01
  18. //
  19. // ============================================================================
  20.  
  21. unsigned short OpenChipDrv( );
  22. unsigned short CloseChipDrv( );
  23. unsigned short Request2ChipDrv( );
  24.  
  25. // ChipCardドライバーへのコマンド
  26. #define GET_CARD_INFORMATION    1               // カード情報の取得
  27. #define READ_WRITE_SRAM         2               // SRAM/EEPROMへの読み書き
  28. #define GET_CARD_INFORMATION2   3               // カード情報の取得 2
  29. #define CHIPCARD_COMMAND        4               // ChipCardコマンド
  30.  
  31. // ChipCardドライバーへのサブコマンド
  32. #define READ_SRAM               1               // SRAM/EEPROMからの読み込み
  33. #define WRITE_SRAM              2               // SRAM/EEPROMへの書き込み
  34.  
  35. #define POWER_ON                1               // 電源オン
  36. #define POWER_OFF               2               // 電源オフ
  37.  
  38. #define CHIPCARD_TC100          1               // ChipCard TC-100
  39. #define CHIPCARD_VW200          2               // ChipCard VW-200
  40.  
  41. // ----------------------------------------------------------------------------
  42. //     汎用IOCtl構造体
  43. // ----------------------------------------------------------------------------
  44.  
  45. // カード情報の取得
  46. struct
  47. {
  48.     unsigned short Socket;                      // 挿入されているソケットの番号
  49.     unsigned char  CardType;                    // ChipCardタイプ
  50.     unsigned char  Flag;                        // フラグ
  51.     unsigned short WinHandle;                   // ウィンドウ・ハンドル
  52.     unsigned long  Base;                        // メモリーウィンドウのベースアドレス
  53.     unsigned long  Size;                        // メモリーウィンドウのサイズ
  54.     unsigned long  EndOffset;                   // SRAM領域の終わりのアドレス
  55.     unsigned short Function;                    // ファンクション番号
  56.     unsigned short Error;                       // 戻りコード
  57. } CardInformation, *CI;
  58.  
  59. // フラグ
  60. #define CARD_INFO2_EXIST        0x80            // カード情報の取得 2 あり
  61.  
  62. // SRAM/EEPROMへの読み書き
  63. struct
  64. {
  65.     unsigned char  Command;                     // サブコマンド
  66.     unsigned long  Buffer;                      // ユーザーバッファへのポインター
  67.     unsigned long  Offset;                      // カード内のアドレス
  68.     unsigned short Size;                        // リクエスト転送サイズ
  69.     unsigned short ActualSize;                  // 実転送サイズ
  70.     unsigned short Return;                      // 戻りコード
  71. } AccessSram, *AS;
  72.  
  73. // カード情報の取得 2
  74. struct
  75. {
  76.     unsigned char Number;                       // カード情報番号
  77.     unsigned long StartAddress1;                // 開始アドレス
  78.     unsigned long Size1;                        // サイズ
  79.     unsigned char DeviceType1;                  // デバイス・タイプ
  80.     unsigned short Return;                      // 戻りコード
  81. } CardInformation2, *CI2;
  82.  
  83. // ChipCardコマンド
  84. struct
  85. {
  86.     unsigned char Command;
  87. } CC_Command, *CCC;
  88.  
  89. unsigned char CSXX[] = "未定義ファンクション";
  90. unsigned char CS04[] = "GetConfigurationInfo";
  91. unsigned char CS07[] = "GetFirstTuple       ";
  92. unsigned char CS0A[] = "GetNextTuple        ";
  93. unsigned char CS0B[] = "GetCardServicesInfo ";
  94. unsigned char CS0C[] = "GetStatus           ";
  95. unsigned char CS0D[] = "GetTupleData        ";
  96. unsigned char CS10[] = "RegisterClient      ";
  97. unsigned char CS14[] = "MapMemPage          ";
  98. unsigned char CS1B[] = "ReleaseIO           ";
  99. unsigned char CS1C[] = "ReleaseIRQ          ";
  100. unsigned char CS1D[] = "ReleaseWindow       ";
  101. unsigned char CS1E[] = "ReleaseConfiguration";
  102. unsigned char CS1F[] = "RequestIO           ";
  103. unsigned char CS20[] = "RequestIRQ          ";
  104. unsigned char CS21[] = "RequestWindow       ";
  105. unsigned char CS30[] = "RequestConfiguration";
  106.  
  107. unsigned char *CS_FUNC[0x31] =
  108. {
  109.     CSXX,CSXX,CSXX,CSXX,CS04,CSXX,CSXX,CS07,
  110.     CSXX,CSXX,CS0A,CS0B,CS0C,CS0D,CSXX,CSXX,
  111.     CS10,CSXX,CSXX,CSXX,CS14,CSXX,CSXX,CSXX,
  112.     CSXX,CSXX,CSXX,CS1B,CS1C,CS1D,CS1E,CS1F,
  113.     CS20,CS21,CSXX,CSXX,CSXX,CSXX,CSXX,CSXX,
  114.     CSXX,CSXX,CSXX,CSXX,CSXX,CSXX,CSXX,CSXX,
  115.     CS30
  116. };
  117.  
  118. unsigned char ERRXX[] = "未定義の戻りコード  ";
  119. unsigned char ERR00[] = "正常終了            ";
  120. unsigned char ERR01[] = "アダプターが無効    ";
  121. unsigned char ERR02[] = "属性が無効          ";
  122. unsigned char ERR03[] = "ベースアドレスが無効";
  123. unsigned char ERR04[] = "EDCが無効           ";
  124. unsigned char ERR06[] = "IRQが無効           ";
  125. unsigned char ERR07[] = "オフセットが無効    ";
  126. unsigned char ERR08[] = "ページが無効        ";
  127. unsigned char ERR09[] = "読み取りエラー      ";
  128. unsigned char ERR0A[] = "サイズが無効        ";
  129. unsigned char ERR0B[] = "ソケットが無効      ";
  130. unsigned char ERR0D[] = "タイプが無効        ";
  131. unsigned char ERR0E[] = "Vccが無効           ";
  132. unsigned char ERR0F[] = "Vppが無効           ";
  133. unsigned char ERR11[] = "ウィンドウが無効    ";
  134. unsigned char ERR12[] = "書き込みエラー      ";
  135. unsigned char ERR14[] = "PCカードが存在しない";
  136. unsigned char ERR15[] = "サポートされていないファンクション";
  137. unsigned char ERR16[] = "サポートされていないモード        ";
  138. unsigned char ERR17[] = "速度が無効          ";
  139. unsigned char ERR18[] = "実行中(ビジィ)      ";
  140. unsigned char ERR19[] = "一般エラー          ";
  141. unsigned char ERR1A[] = "ライト・プロテクト   ";
  142. unsigned char ERR1B[] = "引数の長さが無効    ";
  143. unsigned char ERR1C[] = "引数が無効          ";
  144. unsigned char ERR1D[] = "コンフィグレーションが解放されていない";
  145. unsigned char ERR1E[] = "すでに使用されている";
  146. unsigned char ERR1F[] = "項目がない          ";
  147. unsigned char ERR20[] = "リソース外          ";
  148. unsigned char ERR21[] = "ハンドルが無効      ";
  149.  
  150. unsigned char *CS_ERR[0x22] =
  151. {
  152.     ERR00,ERR01,ERR02,ERR03,ERR04,ERRXX,ERR06,ERR07,
  153.     ERR08,ERR09,ERR0A,ERR0B,ERRXX,ERR0D,ERR0E,ERR0F,
  154.     ERRXX,ERR11,ERR12,ERRXX,ERR14,ERR15,ERR16,ERR17,
  155.     ERR18,ERR19,ERR1A,ERR1B,ERR1C,ERR1D,ERR1E,ERR1F,
  156.     ERR20,ERR21
  157. };
  158.  
  159. unsigned char AC00[] = "ChipCardドライバー・ファンクション";
  160.  
  161. unsigned char ERRZ0[] = "正常終了                      ";
  162. unsigned char ERRZ1[] = "サポートしていないPCカードです";
  163. unsigned char ERRZ2[] = "すでにイネーブルされています  ";
  164. unsigned char ERRZ3[] = "ChipCardは使用中です          ";
  165.  
  166. unsigned char *AC_ERR[4] =
  167. {
  168.     ERRZ0,ERRZ1,ERRZ2,ERRZ3
  169. };
  170.  
  171. unsigned char ERRS0[] = "正常終了                          ";
  172. unsigned char ERRS1[] = "コマンドの誤り                    ";
  173. unsigned char ERRS2[] = "CS MapMemPageのエラー             ";
  174. unsigned char ERRS3[] = "不適切なオフセットが指定されました";
  175. unsigned char ERRS4[] = "不適切なサイズが指定されました    ";
  176. unsigned char ERRS5[] = "SRAMの終わり                      ";
  177. unsigned char ERRS6[] = "DevHlp Lockのエラー               ";  // OS/2のみ
  178. unsigned char ERRS7[] = "DevHlp PhysToVirtのエラー         ";  // OS/2のみ
  179. unsigned char ERRS8[] = "EEPROMへの書き込みのエラー        ";
  180.  
  181. unsigned char *AS_ERR[9] =
  182. {
  183.     ERRS0,ERRS1,ERRS2,ERRS3,ERRS4,ERRS5,ERRS6,ERRS7,ERRS8
  184. };
  185.  
  186. unsigned char CHIP0[] = "不明なPCカード ";
  187. unsigned char CHIP1[] = "ChipCard TC-100";
  188. unsigned char CHIP2[] = "ChipCard VW-200";
  189.  
  190. unsigned char *CC_TYPE[3] =
  191. {
  192.     CHIP0,CHIP1,CHIP2
  193. };
  194.  
  195. unsigned char DEV0[] = "      ";
  196. unsigned char DEV1[] = "SRAM  ";
  197. unsigned char DEV2[] = "EEPROM";
  198.  
  199. unsigned char *CC_DEV[3] =
  200. {
  201.     DEV0,DEV1,DEV2
  202. };
  203.  
  204. unsigned char CI200[] = "正常終了            ";
  205. unsigned char CI201[] = "カード情報番号の誤り";
  206.  
  207. unsigned char *CI2_ERR[2] =
  208. {
  209.     CI200,CI201
  210. };
  211.  
  212. #define BUFFER_SIZE     0x2000
  213.  
  214. unsigned long  Offset;
  215. unsigned short Size;
  216. unsigned char  Buffer[BUFFER_SIZE] = { 0 };
  217.  
  218. main( )
  219. {
  220.     unsigned short handle;
  221.     unsigned short cmd = 0;
  222.     unsigned short key = 0;
  223.     unsigned short skt;
  224.     unsigned short err;
  225.     unsigned short i;
  226.     unsigned short j;
  227.     unsigned short k;
  228.     unsigned char  far *p;
  229.  
  230.     // ------------------------------------------------------------------------
  231.     //     プログラム名/バージョンの表示
  232.     // ------------------------------------------------------------------------
  233.  
  234.     printf( "\n" );
  235.     printf( "IBM DOS ChipCardドライバー・ユーティリティー V2.01              \n"   );
  236.     printf( "(C) Copyright IBM Corporation 1995, 1996. All rights reserved. \n\n" );
  237.  
  238.     // ------------------------------------------------------------------------
  239.     //     ChipCardドライバーのオープン
  240.     // ------------------------------------------------------------------------
  241.  
  242.     handle = OpenChipDrv( );
  243.     if ( handle == 0 )
  244.         printf( "オープン・エラー: ハンドル = %X \n\n", handle );
  245.  
  246.     // ------------------------------------------------------------------------
  247.     //     メイン・メニューの表示
  248.     // ------------------------------------------------------------------------
  249.  
  250.     while( 1 )
  251.     {
  252.         printf( "1. カード情報の取得        \n" );
  253.         printf( "2. SRAM/EEPROMへの読み書き \n" );
  254.         printf( "3. カード情報の取得 2      \n" );
  255.         printf( "4. ChipCardコマンド        \n" );
  256.         printf( "9. 終了                    \n" );
  257.         printf( "コマンド番号 = " );  scanf( "%d", &cmd );
  258.         printf( "\n" );
  259.  
  260.         if ( cmd == 9 )  break;
  261.         if ( ( cmd < 1 ) || ( cmd > 4 ) )  break;
  262.  
  263.         switch( cmd )
  264.         {
  265.             case GET_CARD_INFORMATION:
  266.                 printf( "**** カード情報の取得 **** \n" );
  267.                 CI = &CardInformation;
  268.                 err = Request2ChipDrv( handle, cmd, CI );
  269.                 printf( "ソケット           = %X    \n", CI->Socket           );
  270.                 printf( "ChipCardの種類     = %s    \n", CC_TYPE[CI->CardType]);  // #25
  271.                 printf( "フラグ             = %X    \n", CI->Flag             );  // #20
  272.                 printf( "ベースアドレス     = %lXh  \n", CI->Base             );
  273.                 printf( "ウィンドウのサイズ = %dKB  \n", (CI->Size)/1024      );
  274.                 printf( "SRAM領域の終わり   = %ldKB \n", (CI->EndOffset)/1024 );  // #01
  275.  
  276.                 if ( ( CI->Function & 0xFF00 ) == 0xAF00 )
  277.                 {
  278.                     printf( "ファンクション     = %s \n", CS_FUNC[CI->Function-0xAF00] );
  279.                     printf( "戻りコード         = %s \n", CS_ERR[CI->Error]            );
  280.                 }
  281.                 else if ( ( CI->Function & 0xFF00 ) == 0xAC00 )
  282.                 {
  283.                     printf( "ファンクション     = %s \n", AC00              );
  284.                     printf( "戻りコード         = %s \n", AC_ERR[CI->Error] );
  285.                 }
  286.                 else
  287.                 {
  288.                     printf( "ファンクション     = %X \n", CI->Function );
  289.                     printf( "戻りコード         = %X \n", CI->Error    );
  290.                 }
  291.  
  292.                 if ( err )
  293.                     printf( "エラー: エラー = %X \n", err );
  294.                 break;
  295.  
  296.             case READ_WRITE_SRAM:
  297.                 printf( "**** SRAM/EEPROMへの読み書き **** \n" );
  298.                 printf( "1. 読み込み                       \n" );
  299.                 printf( "2. 書き込み                       \n" );
  300.                 printf( "9. 終了                           \n" );
  301.                 printf( "コマンド番号 = " );  scanf( "%d", &key );
  302.                 printf( "\n" );
  303.  
  304.                 if ( key == 9 )  break;
  305.                 if ( ( key < 1 ) || ( key > 2 ) )  break;
  306.  
  307.                 for ( i = 0; i < BUFFER_SIZE; ++i )  Buffer[i] = 0x20;
  308.  
  309.                 AS = &AccessSram;
  310.                 AS->Command = (char) key;
  311.  
  312.                 switch( key )
  313.                 {
  314.                     case READ_SRAM:
  315.                         p = (unsigned char far *) Buffer;
  316.                         AS->Buffer = (unsigned long) p;
  317.                         Offset = 0;
  318.                         Size   = 0;
  319.                         printf( "カード・オフセット (16進) = " );  scanf( "%lx", &Offset );
  320.                         AS->Offset = Offset;
  321.                         printf( "読み込みサイズ           = " );  scanf( "%d", &Size );
  322.                         AS->Size = Size;
  323.                         break;
  324.  
  325.                     case WRITE_SRAM:
  326.                         printf( "ユーザー・バッファ        = " );  scanf( "%s", Buffer );
  327.                         p = (unsigned char far *) Buffer;
  328.                         AS->Buffer = (unsigned long) p;
  329.                         Offset = 0;
  330.                         Size   = 0;
  331.                         printf( "カード・オフセット (16進) = " );  scanf( "%lx", &Offset );
  332.                         AS->Offset = Offset;
  333.                         printf( "書き込みサイズ           = " );  scanf( "%d", &Size );
  334.                         AS->Size = Size;
  335.                         break;
  336.                 }
  337.  
  338.                 err = Request2ChipDrv( handle, cmd, AS );
  339.  
  340.                 switch( key )
  341.                 {
  342.                     case READ_SRAM:
  343.                         printf( "ユーザー・バッファ        = \n" );
  344.                         for ( i = 0; i < AS->ActualSize; i += 16 )
  345.                         {
  346.                             for ( j = i; ( j < AS->ActualSize ) && ( j - i < 16 ); ++j )
  347.                             {
  348.                                 printf( "%02X ", Buffer[j] );
  349.                             }
  350.  
  351.                             k = 16 - ( j - i );
  352.                             if ( k != 0 )
  353.                                 for ( j = 0; j < k; ++j )  printf( "   " );
  354.  
  355.                             printf( "  " );
  356.  
  357.                             for ( j = i; ( j < AS->ActualSize ) && ( j - i < 16 ); ++j )
  358.                             {
  359.                                 printf( "%c", Buffer[j] );
  360.                             }
  361.  
  362.                             printf( "\n" );
  363.                         }
  364.                         printf( "実サイズ                 = %d \n", AS->ActualSize  );
  365.                         break;
  366.  
  367.                     case WRITE_SRAM:
  368.                         printf( "実サイズ                 = %d \n", AS->ActualSize  );
  369.                         break;
  370.                 }
  371.  
  372.                 printf( "戻りコード               = %s \n", AS_ERR[AS->Return] );
  373.                 break;
  374.  
  375.             case GET_CARD_INFORMATION2:
  376.                 printf( "**** カード情報の取得 2 **** \n" );
  377.                 CI = &CardInformation;
  378.                 err = Request2ChipDrv( handle, GET_CARD_INFORMATION, CI );
  379.  
  380.                 if ( err )
  381.                 {
  382.                     printf( "エラー: エラー = %X \n", err );
  383.                     break;
  384.                 }
  385.  
  386.                 i = (unsigned short) ( CI->Flag & 0x07 );
  387.                 if ( i == 0 )
  388.                 {
  389.                     printf( "カード情報 2 がありません \n" );
  390.                     break;
  391.                 }
  392.  
  393.                 CI2 = &CardInformation2;
  394.  
  395.                 for ( j = 1; j <= i; ++j )
  396.                 {
  397.                     CI2->Number = j;
  398.  
  399.                     err = Request2ChipDrv( handle, cmd, CI2 );
  400.  
  401.                     printf( "開始アドレス    = %lXh \n", CI2->StartAddress1 );
  402.                     printf( "サイズ          = %dKB \n", (CI2->Size1)/1024  );
  403.                     printf( "デバイス・タイプ = %s   \n", CC_DEV[CI2->DeviceType1] );
  404.                     printf( "戻りコード      = %s   \n", CI2_ERR[CI2->Return] );
  405.                 }
  406.                 break;
  407.  
  408.             case CHIPCARD_COMMAND:
  409.                 printf( "**** ChipCardコマンド **** \n" );
  410.                 printf( "1. 電源オン                \n" );
  411.                 printf( "2. 電源オフ                \n" );
  412.                 printf( "3. EEPROMのプロテクト・オン \n" );
  413.                 printf( "4. EEPROMのプロテクト・オフ \n" );
  414.                 printf( "9. 終了                    \n" );
  415.                 printf( "コマンド番号 = " );  scanf( "%d", &key );
  416.                 printf( "\n" );
  417.  
  418.                 if ( key == 9 )  break;
  419.                 if ( ( key < 1 ) || ( key > 4 ) )  break;
  420.  
  421.                 CCC = &CC_Command;
  422.                 CCC->Command = (char) key;
  423.  
  424.                 err = Request2ChipDrv( handle, cmd, CCC );
  425.  
  426.                 break;
  427.         }
  428.         printf( "\n" );
  429.     }
  430.  
  431.     // ------------------------------------------------------------------------
  432.     //     ChipCardドライバーのクローズ
  433.     // ------------------------------------------------------------------------
  434.  
  435.     err = CloseChipDrv( handle );
  436.     if ( err )
  437.         printf( "クローズ・エラー: エラー = %X \n", err );
  438. }
  439.  
  440. // ----------------------------------------------------------------------------
  441. //
  442. //     ChipCardドライバーのオープン
  443. //
  444. // ----------------------------------------------------------------------------
  445.  
  446. unsigned short OpenChipDrv( )
  447. {
  448.     unsigned short     handle;
  449.     unsigned char      name[9] = "$CHIP   ";
  450.     unsigned char near *np;
  451.  
  452.     name[8] = 0;
  453.     np      = name;
  454.  
  455.     _asm
  456.     {
  457.                 push    ax
  458.                 push    dx
  459.                 push    ds
  460.                 mov     ax, ss
  461.                 mov     ds, ax
  462.                 mov     dx, np
  463.                 mov     ax, 3D02h
  464.                 int     21h
  465.                 jc      err_open
  466.                 mov     handle, ax
  467.                 jmp     end_open
  468.         err_open:
  469.                 xor     ax, ax
  470.                 mov     handle, ax
  471.         end_open:
  472.                 pop     ds
  473.                 pop     dx
  474.                 pop     ax
  475.     }
  476.  
  477.     return( handle );
  478. }
  479.  
  480. // ----------------------------------------------------------------------------
  481. //
  482. //     ChipCardドライバーのクローズ
  483. //
  484. // ----------------------------------------------------------------------------
  485.  
  486. unsigned short CloseChipDrv( unsigned short handle )
  487. {
  488.     unsigned short err;
  489.  
  490.     _asm
  491.     {
  492.                 push    ax
  493.                 push    bx
  494.                 mov     ah, 3Eh
  495.                 mov     bx, handle
  496.                 int     21h
  497.                 jc      err_close
  498.                 xor     ax, ax
  499.         err_close:
  500.                 mov     err, ax
  501.                 pop     bx
  502.                 pop     ax
  503.     }
  504.  
  505.     return( err );
  506. }
  507.  
  508. // ----------------------------------------------------------------------------
  509. //
  510. //     ChipCardドライバーへのリクエスト
  511. //
  512. // ----------------------------------------------------------------------------
  513.  
  514. unsigned short Request2ChipDrv( handle, cmd, pkt )
  515. unsigned short handle;
  516. unsigned short cmd;
  517. unsigned char  *pkt;
  518. {
  519.     unsigned short err;
  520.  
  521.     _asm
  522.     {
  523.                 push    ax
  524.                 push    bx
  525.                 push    cx
  526.                 push    dx
  527.                 mov     ax, 440Ch
  528.                 mov     bx, handle
  529.                 mov     ch, 0ACh
  530.                 mov     cl, cmd
  531.                 mov     dx, pkt
  532.                 int     21h
  533.                 jc      err_ioctl
  534.                 xor     ax, ax
  535.         err_ioctl:
  536.                 mov     err, ax
  537.                 pop     dx
  538.                 pop     cx
  539.                 pop     bx
  540.                 pop     ax
  541.     }
  542.  
  543.     return( err );
  544. }
  545.  
  546.