******************************************************************************
  GETPN.DOC
       getpn.com  説明書
                          1993. 1.
******************************************************************************

【概 要】
  getpn.comは, DOS上のTSR型プログラムで, 実行した外部コマンド
 についてそのプログラム名, 実行開始時刻, 終了時刻を, プログラム常駐時に指定
  されたファイルに自動記録するユーティリティです.


【動作機種等】
  機種依存のコードはありませんので, DOSマシンなら全て動作可能です.
  DOSバージョンは, 3.0以上なら問題ありません. 


【使用方法】
  常 駐  >getpn file

  常駐解除  >getpn -r

  常駐時には, 実行コマンドに関するプログラム名等の記録を格納するファイルを
 指定します. ファイル名は任意ですが, ドライブ名を含めた絶対パスで指定します.
 相対パスの指定も可能ですが, 常駐時点からカレントドライブ・ディレクトリが変
  更となった場合に記録が取れません.
  既存ファイルが指定された場合には, 記録を追加格納します.

  常駐時のサイズは, 1760バイトです.

  -r または -R のオプションで常駐を解除します.


【記録フォーマット】
  常駐時に指定したファイルには, 次のようにテキスト形式でファイル名他が格納
 されます.

  ファイル名  ベース+拡張子   (11文字)
  開始年月日  YYMMDD    ( 6文字)
  開始時刻   HHMMSSss  ( 8文字)
  終了年月日  YYMMDD    ( 6文字)
  終了時刻   HHMMSSss  ( 8文字)
  行末     CR, LF       ( 2文字)  計 41文字

 時刻のssは100分の1秒です. PC98機ではハードウェアの関係上常に0と
 なります.

  外部コマンド一つ実行する毎に上記内容がファイルに追加書きされます. テキス
 ト形式ですので, 記録内容はTYPEコマンドで簡単に見ることができます. また
 その他のデータベース言語に簡単に読み込みことも可能かと思います.

  ファイル名は, 別プログラムによる集計処理等をやり易くするために全て大文字
 に変換するとともに拡張子の記録位置を統一しました.

  記録のサンプルを次に示します.
  ----+----1----+----2----+----3----+----4
  ADDDRV  EXE9301241810530093012418105400
  MIFES   EXE9301241810540093012418110800
  DELDRV  EXE9301241811080093012418110800
  C1      EXE9301241811160093012418111900
  C2      EXE9301241811190093012418112400
  C3      EXE9301241811240093012418112600
  LINK    EXE9301241811260093012418112900
  CL      EXE9301241811160093012418112900

  外部コマンドの実行時間は 終了時刻−開始時刻 で簡単に求められますが, 常駐
 サイズを小さくすることと, 別プログラムで後で計算可能なことから常駐部分では
 処理しませんでした.


【プログラム内部の概説】
  起動された外部コマンド名は, INT 21H (AX=4B00H 子プロセスのロード&実行) 
  をフックして取得しています.

   INT 21H の割り込みベクタを常駐ルーチンに書換え, AX=4B00H を監視します. 
  AX=4B00H で呼ばれた時に DS:DX で渡されるファイル名, その時の日付, 時刻をシ
  ステムタイムから取得し, 常駐部内部のワークエリアに保存します. その後, オリ
  ジナルの INT 21H ルーチンを呼び出し, 指定された子プロセスを起動します.

    この子プロセスの実行が終了し常駐部に戻ってきた時に, 保存しておいたファイ
  ル名, 開始日付・時刻に, 戻った時点の日付・時刻を付加してファイルに書き込み
  を行います.

  親プロセスから呼び出された子プロセスがまた子プロセスを呼び出すことがあり
 ますので, 常駐ルーチンはワークエリアを含めてリエントラントでなければなりま
  せん. このためファイル名等の保存ワークエリアはスタック構造としています. こ
  のために子プロセス呼出しを伴う外部コマンドは, 呼びだした子プロセスの方が先
  にファイルに記録されます. MSCのCLコマンドはC1やLINKの後に記録さ
  れることになります.

  この子プロセス呼出しのネストは, 10ネストまでを記録可能としています.
  10ネストを越える場合には, 常駐部の処理をスキップさせます. 実用上は問題な
  い深さだと思います.

  getpn.com は, この INT 21H の割り込みの他, INT 2FH の多重起動割
 り込みもトラップしています. こちらの方は常駐の確認, 解放が目的です.
  INT 2FH に渡すプログラム番号(AH の値)は 0FFH を割り当てています. このた
 め AH=0FFH で INT 2FH を使用するプログラム等とは共存できません.

  また, INT 21H (AX=4B00H) のトラップで動作しますので, TYPEやCOPY等
 の COMMAND.COM の内部コマンドやBATファイル名は記録することができません.
 拡張子が EXE, COM のものだけが記録されます.


【作成動機等】
  社内のOA推進部門に身を置く者として, 社内ユーザーのパソコンの使用状況を
 常に把握しておかねばなりません. パソコン導入当初は物珍しさもあって, パソコ
 ンの傍らに備え付けてある使用簿に, ユーザーが使用記録をきちんと記帳してくれ
 ていたようですが, 現在のようにパソコンの使用が一般化しますと誰も記帳なんか
 してくれません.
    ハードウェアも安くなりその使用実績等はあまり問題視されることは少なくなり
  ましたが, 立場上知らぬままで過ごすわけにもいかず, 何か手間をかけずに確実に
  使用実績を記録する方法はないものかと考えた結果の産物がこれでした. 

  送付ディスクの中のもう一つのプログラム count.exe は, このような目
 的の為のサンプルプログラムです. getpn.com で記録された外部コマンド
 毎の実行回数, 実行総時間を表示します. 
  コマンドラインにて sort < file | count で結果を表示します. 


【使用言語等】
  MASM Ver5.1 を使用しました.
  確認用サンプルプログラム COUNT.EXE は MSC Ver5.1 を使用しました.


【最後に】
  getpn.com の記録からは, ユーザーがパソコンの前からプログラムを立
 ち上げたまま離席していた時間を推測することは不可能です. 実際の所, 私の社内で
 はこの時間が問題となりました. そこで現在ではキーの打鍵間隔の時間を監視し, こ
 の時間が一定時間を越えた場合離席とみなし, その時間を無効時間として外部プログ
 ラムの使用時間を計測するユーティリティを作成し使用しています. (マウス中心の
 アプリケーションには対応できていません.)
    この実現は, キーボード割り込みをトラップすることとインターバルタイマーを準
  備することで可能です. いずれにしても機種依存のプログラムとなりますので, 今回
  は機種依存のない初期のものを投稿させて頂きました. (投稿にあたり一部書き直し
  ました.)


******** End of GETPN.DOC ****************************************************