home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 January (DVD) / VPR980100.ISO / DRIVER / IBM / VW200 / VW200_2.EXE / CHIPUTL / CHIPUTL2.C < prev    next >
Text File  |  1996-03-07  |  19KB  |  516 lines

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