SSPの「通信」について/あるいは新規トークチラ見せ画像の作り方

執筆開始日:2022/12/30

記事公開日:2023/01/14

(1) はじめに。

本記事は、伺かのベースウェアたる SSP が情報のやり取り(通信)を行うため、外部に向けて開放している窓口周りの規格・先人のツール等々について、うかどんで識者の皆さまから教わった内容と、自分なりに調べたことをまとめて、整理してみたものです。

また、学んだ結果として「こんなことができるみたいです」の例も、備忘録的に記録してみた記事になっております。

) 動機:なんでこれに興味持ったん?

ゴースト制作をしている内に、気になったから…です。

調べる前は、次の Figure 1. に示したような「各要素間でのやり取り」がどんな風に行われているのか、さっぱりわからなくて…。

Figure 1. dullNekoの最初の疑問(3つ)

別に「疑問1」「疑問2」「疑問3」が分からないままでもゴースト制作はできる…と頭では分かっていても、どうにもすっきりせず。

そんなことをごちゃごちゃと ukadon でトゥートしていた所、(見るに見兼ねたであろう)識者の皆さまから色々と教えて頂き、ようやく少し理解できた(っぽい)ので、忘れないよう自分なりに記録しておこう…と考えた結果がこちらの記事になります

結論:早速ですが、整理した結果から。

早速ですが、まとめた結果から。次の Table 1 と Figure 2 が、自分なりに整理した表・図です。

整理してみれば…そんなに難しいことをしているわけではない…?感。(※だからといって自分でDLLの実装ができるか、は別ですが)

少なくとも「外部からトーク(あるいは通知)を喋ってもらう」程度であるなら、「SSTP のプロトコルに沿った文字列」を「適切な窓口に、適切な手順で投げればいい」ということは理解できました。

あと、ゴースト間コミュニケート(いわゆる「掛け合い」)が「DirectSSTP」で実現されていることや、その際に参照されるウィンドウハンドルが「FMO(File Mapping Object)」に格納されていて、わざわざ自分でウィンドウ名で調べたりせずとも、SSP標準の「SakuraFMO」を読み込めば「起動しているゴーストさんのカタログ」的感覚で使える…ことも含めて学べたのは、とても有意義でした。

Table 1. 各やりとりの詳細(SHIORI/(Socket) SSTP/DirectSSTP/デバッガの各通信方式・プロトコルの違い一覧)

001_Table_1

Figure 2. (dullNeko の理解で)整理した各部品間の通信図

【参考資料】
(SSPにSSTPサーバとSSTPクライアントの両方があること、ここの図を見ないと見落としてたと思います)■ 伺かシステム用語集https://www.ooyashima.net/db/ukagaka.htm
(SHIORIのDLL仕様、現行版) UKADOC Project DLLhttps://ssp.shillest.net/ukadoc/manual/spec_dll.html
(aya5での実装例) aya5 - manualhttp://umeici.onjn.jp/etcetera/aya5_manual/manual.html#export
(オリジナルの作業記録文書、なぜDLLでポインタを使わなかったかの理由も記述されてた) 伺か - 作業記録文書http://usada.sakura.vg/contents/specification2.html#shioriprotocol
(ぽなさんのがっつり講義資料、SSTP/DirectSSTPのお話も盛りだくさん。ペルソナウェア時代経験者ゆえのトークもあり)(File Mapping Object(FMO)を何で使うのか、とかも言及されてる)(ぶっちゃけこの記事よりこの資料を読んだ方がいいとおもう) 「The Design and Evolution of "Ghost" 」 - Lv.4(三段階評価にて)https://study.shillest.net/2010/0504/ の ponapalt.zip
(SSTP1.xの規格、基本的にはこれ読めばいい) UKADOC Project SSTP/1.xhttps://ssp.shillest.net/ukadoc/manual/spec_sstp.html
Microsoft公式のドキュメント群、DirectSSTPのところの詳細を勉強した時に参照■ データ型の範囲 | Microsoft Learnhttps://learn.microsoft.com/ja-jp/cpp/cpp/data-type-ranges?view=msvc-170■ Windows データ型 (BaseTsd.h) - Win32 apps | Microsoft Learnhttps://learn.microsoft.com/ja-jp/windows/win32/winprog/windows-data-types■ COPYDATASTRUCT (winuser.h) - Win32 apps | Microsoft Learnhttps://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-copydatastruct■ WM_COPYDATA message (Winuser.h) - Win32 apps | Microsoft Learnhttps://learn.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata■ SendMessage function (winuser.h) - Win32 apps | Microsoft Learnhttps://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendmessage
typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; // ポインターの有効桁数の符号なし長型。 // ポインタをunsigned long にキャストして、算術演算する時に使われる型。9801 で固定…みたい。 DWORD cbData; // 32 ビット長の符号なし整数SSTPプロトコルに従った文字列の長さ PVOID lpData; // 任意の型へのポインター。SSTPプロトコルに従った文字列。} COPYDATASTRUCT, *PCOPYDATASTRUCT;
(SSTPプロトコルクライアントの、NaoさんによるPythonでの実装例)(これ公開してくださって無かったら SocketSSTP の動作は分からなかった…本当にありがとうございます…) Pythonで伺かのSSTPを使って通信する方法 - Qiitahttps://qiita.com/Nao_string/items/ce97c15415e994c482db
(非公式のSSTPプロトコル仕様書…だけど、こっちもわかりやすいので実装時にはお世話になるかも) 非公式 SSTP/1.x プロトコル仕様書https://www.ooyashima.net/db/sstp.html
(かつて公開されていたSSTP関連のツール群など。今はもうほとんど入手不可能なのが辛い…。) SSTP - 伺かwiki - atwiki(アットウィキ)https://w.atwiki.jp/ua-ks/pages/47.html
(SSTPプロトコルに関する、うさださくら文書) 伺か - SSTPプロトコルhttp://usada.sakura.vg/contents/sstp.html
(大八洲.NETの用語集: 古い時代のSSTPに関する記述もある) 伺かシステム用語集https://www.ooyashima.net/db/ukagaka.htm
(Don さんによる DirectSSTP 送信テスタ、中身ちゃんと読めればめっちゃ勉強になると思う…できてないですけれど…)(「チラ見せ画像を作りたい」だけなら、こちらを使えば一瞬です) nikolat/DirectSSTPTester: DirectSSTPを送信するシンプルなテストツールhttps://github.com/nikolat/DirectSSTPTester
(SSTP Bottleの構造/SSTP Bottle Cliant までは TCP/IP & HTTP でネットワークの壁を越え、そこから DirectSSTP で処理する、と工夫されている) SSTP Bottlehttp://bottle.mikage.to/doc/inside/slpp.html
(デバッガ関係: 里々側の実装。) satoriya-shiori/Sender.cpp at master · ukatech/satoriya-shiorihttps://github.com/ukatech/satoriya-shiori/blob/master/satoriya/_/Sender.cpp
デバッガ関係: れしば側の実装。) recv_net/ClassRecv.cs at master · nikolat/recv_nethttps://github.com/nikolat/recv_net/blob/master/common/ClassRecv.cs
(WM_COPYDATA と他の(ウィンドウ)メッセージとの違い。)(内部的には「メモリマップトファイルを介した共有メモリによる通信」であること、とか勉強になった) メッセージによるプロセス間通信 - Advanced HSPhttps://chokuto.ifdef.jp/advanced/copydata.html

例示:記事画像みたいな「新規トークチラ見せ画像」作りたい時はどうするの?

「手っ取り早く画像を作りたい」だけなら、

  1. Don さんの DirectSSTPTester の実行ファイルをダウンロードして、

  2. 次の Figure 3 の様な SSTP 形式の文字列を打ち込んで(下記【テンプレート】を DirectSSTPTester の入力ウィンドウ内にコピペした上で、SSPの「スクリプトログ」から「発話時のさくらスクリプト」を拾ってきて、Script: の行を置換すればOK。option: nodescript は忘れずに!)

  3. 目当てのゴーストさんに「送信」すればおしまい。

です。

【テンプレート】
SEND: SSTP/1.0Charset: UTF-8Sender: DirectSSTPTesterScript: 【自分のスクリプトで置換】Option: nodescript

Figure 3. お手軽3秒(は無理にしても多分3分くらいでできる)クッキング例

おしまい。

…ということで、タイトルにあるような「新規トークチラ見せ画像」を手っ取り早く作りたいのなら、Don さんの「DirectSSTPTester」を利用させて頂くのが一番簡単だと思います。

先人の知恵と試行錯誤に敬意を表しつつ、ツールを使わせて頂くのが良いのではないかと。

「さとりすと2」をお使いの方で、ご自分でビルドできる環境をお持ちの方なら、「Satorite.cs 内で定義されている Option に、自分で nodescript を書き加える」…というのも一手かも知れませんが、流石にちょっと大変だと思いますので…。