ロードモジュールの修正(IMASPZAP)
SPZAPはロードモジュールやデータセットの内容をDASD上で直接修正するためのユーティリティです。ロードモジュールに関してはアセンブラー言語で作ったプログラムのソースプログラム修正が行えないような場合に利用されます。例えばISVなど商用のパッケージソフトを提供しているソフトウェア・メーカーにおいて出荷済み製品の障害修正や機能変更を行う場合に使われます。一般のユーザーでは自らのアプリケーション・プログラムの修正に利用することはまずありませんが、ISV製品などを利用している場合、提供元の依頼でSPZAPを使用した作業を行うこともあります。修正データを作ることはなくても、ユーティリティ自体の使い方は覚えておくといいでしょう。
ロードモジュールの修正
// JOB Statement //********************************************************************* //* Sample JCL - IMASPZAP //* ===================== //********************************************************************* //MODLOAD EXEC PGM=IMASPZAP,PARM='IGNIDRFULL' //SYSPRINT DD SYSOUT=* //SYSLIB DD DISP=SHR,DSN=MY.WORKLIB //SYSIN DD * NAME IEFACTRT IEFACTRT LINKLIB(IEFACTRT) VER 01D8 4780,B1F2 BZ LABEL-A REP 01D8 4780,B2E2 BZ LABEL-B IDRDATA MD22001 MODULE MODIFY NUMBER //
プログラム名はMSPではJQPSPZAP、VOS3ではJSPPTCHですがいずれもIMASPZAPの別名が付いています。ただし制御文には一部非互換もあるから必要に応じてマニュアルを参照してください。ここで紹介した機能に関しては同じです
SYSLIB DD文で修正するロードモジュールが格納されている区分データセットを指定します。
SYSIN DD文で実際に修正作業を行うための制御文を指定します。NAME文で修正するロードモジュールのメンバー名とCSECT名を、VER文で現在のモジュール内容を修正箇所のCSECT先頭からのオフセット値、現在のデータの組み合わせを、REP文で修正後のデータを、オフセット値、更新後データの組み合わせで記述します。VERとREPはペアーである必要はありません。VERのみを羅列した後にREPをまとめて書いてもかまいません。IDRDATAはモジュールに修正履歴を残す場合に使用します。なくても修正はなされます。IDRDATAを使用する場合、ロードモジュール内のIDRレコードに空きエントリーがないとIDRDATAは書き込みできません。この場合SPZAPはVERデータがすべて合っていてもCC=8で終了します。JCL例のようにIGNIDRFULLパラメーターを指定すればIDRDATAは無視されモジュール内容は修正されます。この場合CC=4となります。VOS3ではIGNIDRFULLパラメーターはなく、常にIGNIDRFULLパラメーターが指定されたのと同じ動作になります。
パッケージソフトのプログラム修正などではSPZAPの制御文は提供元ベンダーから示されるのが普通です。OS自身のモジュールはよほどの緊急事態でない限りSPZAPで修正されることはまずありません。SMP/Eと言うシステム保守機能によって行われます。
データセット・ブロックの直接修正
// JOB Statement //********************************************************************* //* Sample JCL - IMASPZAP //* ===================== //********************************************************************* //FILEMOD EXEC PGM=IMASPZAP //SYSPRINT DD SYSOUT=* //SYSLIB DD DISP=SHR,DSN=TK.SORT.SAMPIN //SYSIN DD * ABSDUMP ALL DUMP BY HEX ONLY ABSDUMPT ALL DUMP BY HEX&CHAR WITH S/370-OPCODE CCHHR 001E000C01 LOCATE TARGET BLOCK ADDR VER 0020 4040,4040 C' ' REP 0020 C1C2,C3C4 C'ABCD' ABSDUMPT 001E000C01 001E000C01 VERIFY UPDATED RECORD //
SYSLIB DD文で修正するデータセットを指定します。SYSIN DD文で実際に修正作業を行うための制御文を指定します。
ABSDUMPとABSDUMPTはデータセットの物理レコード内容を印刷します。レコードと言ってもDASD上の物理レコードですからプログラムから見ればブロックになります。データは16進ダンプの形式で出力されます。
データセットの場合はNAMEではなくCCHHR文で修正ブロック(物理レコード)の位置を示します。位置はシリンダ番号+トラック番号+レコード番号を16進数で繋げたDASDの先頭からの絶対トラックアドレスです。実際の値はABSDUMP(T)の出力で知ることができます。VERとREPはロードモジュール同様にデータ修正する位置と更新後の内容です。位置はブロックの先頭からのオフセット値です。通常はISPFエディターのHEXエディットモードなどでもバイナリーデータの修正ができますから、今ではSPZAPで直接修正するようなことはまず無いでしょう。
VTOCのデータ修正
//SYSLIB DD DISP=OLD,DSN=FORMAT4.DSCB,
// UNIT=SYSALLDA,VOL=SER=WRKVOL,DCB=KEYLEN=44
SYSLIB DD文に上記のように指定すればDASDボリュームのVTOCを修正することもできます。VTOCはキー長44、データ長96バイトの非ブロック化固定長レコードのデータセットとして捉えることができます。ABSDUMPでダンプすればVTOCのレコード内容がわかります。VER/REPでVTOCを直接修正することもできます。ただし実行時にはコンソールにVTOC修正の許可を求めるオペレーター・リプライ・メッセージが出力されますのでの注意してください。VTOC修正はプログラム・エラーやI/Oエラーなどで破壊されたVTOCを修復する目的で使われる場合があります。使用を誤るとボリューム全体をパァにすることもありますので、慎重な作業が必要です。なおFORMAT4.DSCBはVTOCを示す汎用的な名前ではありません。他のユーティリティで使用してもVTOCにアクセスできるわけではありません。