日本語化のページも参考にしてください。

2003.04.11 (金) 22:13:04 <u*j*2*6*> BugTrackの一部をここに移動しました
2003.08.14 (木) 01:31:11 <Heracules> Redirectの仕様を若干更新。アドレス:ポート#13が正式な仕様の模様。
2003.08.21 (木) 04:54:04 <Heracules> Lopsterは、2番でログイン後、10203番コマンドと10112番コマンドを送信します。751を送ると752を返します。
2003.08.21 (木) 04:54:51 <Heracules> [10203] "+ERROR +BAN +CHANGE +KILL +LEVEL +SERVER +MUZZLE +PORT +WALLOP +CLOAK +FLOOD +PING +MSG +WHOIS +ANNOUNCE +BROWSE +MOTD +FRIEND +CHANNEL +REGISTER +VAR +ABUSE"
2003.08.21 (木) 04:55:08 <Heracules> 何を意味するのかはnap.txtにはなかったので不明です。
2003.08.21 (木) 04:56:54 <Heracules> AudioGnome?も10112を送るようです。
2003.08.21 (木) 05:05:08 <Heracules> 10203番コマンドの資料をみつけました(Slavaにも搭載されてました)。
2003.08.21 (木) 05:05:33 <Heracules> 10203 - set user mode [CLIENT]
2003.08.21 (木) 05:05:45 <Heracules> 書式:[-]{ALL,MUZZLE,BAN,KILL,PORT,WALLOP} [ ... ]
2003.08.31 (日) 07:54:26 <Heracules> Shift-JIS以外の2バイト文字を使わせたくない(外人の流入による文字化け等の防止)場合のための判別方法を追記。
2003.09.01 (月) 05:29:57 <えーと> Shift_JISの判定ですが、
2003.09.01 (月) 05:30:05 <えーと> LeadBytes?ってPublic変数がVCL(sysutils)にあるので、
2003.09.01 (月) 05:30:22 <えーと> それを使うと多少便利かもしれません。
2002.10.29 (火) 23:38:03 <u*j*2*6*> コンパイルしたら1時間おきにかたまる!!という人へ。Delphiのサービスパックいれてみてね
2002.10.29 (火) 23:40:20 <u*j*2*6*> http://www.borland.co.jp/delphi/del6up.html#del6up2
2002.10.29 (火) 23:41:41 <u*j*2*6*> http://www.borland.co.jp/delphi/del6up.html#del6rtl
2002.11.09 (土) 15:30:44 <Alan Smithee> DB書き出しのタイミング(だと思われる)でBANリスト等が巨大かつユニプロセッサだとやはり固まる。マルチプロセッサ環境や本家のSlavaNapでは固まらない。
2002.11.09 (土) 19:26:59 <u*j*2*6*> (・ロ・)ホ,('ロ')ホ--ッッ
2002.11.16 (土) 16:05:05 <Heracules> AthlonXP2000+ユニプロセッサ環境(Win2kSP3)では固まらないんですが?・・・なんででしょうねw
2003.04.10 (木) 15:38:39 <|-`)> 「サーバー」-「データベースの保存」 で再現するか試してみては?>Alan 少なくともDB保存時か否かははっきりするかと。
2003.08.01 (金) 19:45:30 <Heracules> わかると思うけど微妙なコメント:explorer.exe置き換えのときはタスクマネージャからプロセスを終了して置き換えてください。(あたりまえかw
2003.11.07 (金) 20:23:15 <u*j*2*6*> GPLの解釈ちがうかな?
2003.11.10 (月) 23:21:55 <Heracules> たぶんあってると思う・・・。ってことはDLLないと実行できないような場合はGPLの制約にしばられちゃうのか・・・。
2003.11.10 (月) 23:22:21 <Heracules> 別モジュール(同じメモリ空間で動作しない)ならば公開する義務はないとか。
2003.11.10 (月) 23:44:10 <u*j*2*6*> あ、前提を1コ忘れてた。ソース公開したくないdllには、GPLのソースが使われてないっていうのが前提ですね
2003.11.10 (月) 23:48:57 <u*j*2*6*> 別モジュールっていうのは下の4パターンのうち左下・右下のパターンのことでいい?
2003.11.15 (土) 21:20:11 <Heracules> たぶん、メモリ空間がいっしょじゃない(DLLとして別ファイル化し外に出している)ならば必須DLLでも問題ないと思う
2003.11.15 (土) 21:20:40 <Heracules> DLLにGPLコードが使われていないってのは当然の前提ですがw
2003.11.16 (日) 00:02:25 <u*j*2*6*> へー、そうなんだ
2003.11.16 (日) 00:44:20 <u*j*2*6*> DLLとして別ファイル化=メモリ空間がいっしょじゃないってことになるの?うーむ
2003.11.16 (日) 00:45:42 <u*j*2*6*> このあたりがポイントかな
2003.11.16 (日) 09:46:06 <Heracules> 完全な黒からグレーゾーンにもってけるって程度の微妙なとこかもw
2003.12.17 (水) 17:21:43 <Heracules> 一応コンパイルDelphi7でやってみたけど、安全でない型としてPointerがやっぱり警告でますね(一応動くと思うけど)。
2003.12.17 (水) 17:31:47 <Heracules> settings.pas書き加えようとしたらエラー(:が必要な場所に識別子がある云々)が出る(settings.pasを閉じた状態ではコンパイル可能)。

Delphi7でコンパイルするには(BugTrackの通りすがりの人ありがとう)

下のような感じでDelphi7のVersion判断をRX.INCで定義すればOKのようです(試してないのでうまくいったら教えてください)

{$IFDEF VER150} { Borland Delphi 7.0 }
  {$DEFINE RX_D3}
  {$DEFINE RX_D4}
  {$DEFINE RX_D5}
  {$DEFINE RX_D6}
  {$DEFINE RX_D7}
  {$WARN SYMBOL_PLATFORM OFF}
  {$WARN UNIT_PLATFORM OFF}
{$ENDIF}

GPL回避作戦

GPL対策.png

DelphiのTTimerの精度について

毎回のイベントごとに誤差がおおきくなっていく
高精度タイマ
(Delphi-ML:71547) Re: 計測時間間隔が重要

XPのデザインに対応する

http://www.namakoworld.com/lowtech/d6tips/dtips4.htm
http://homepage1.nifty.com/ht_deko/tech002.html#tech021

Delphi 6 で Shift-JIS でフォームを保存する

引用元:http://www.zoo.co.jp/solution/tech/delphi/

Delphi 6 は Kylix との互換性のため、フォームファイル(.dfm ファイル)を
UniCode で保存します。これを Delphi 5 同様に Shift-JIS で
保存するには次のようにします。

レジストリエディタを起動します。 
HKEY_CURRENT_USER\Software\Borland\Delphi\6.0 とたどります。 
[編集(E)] - [新規作成(N)] - [キー(K)] を選び、
"FileFormat" という名前のキーを作成 します。 
[編集(E)] - [新規作成(N)] - [DWORD 値(D)] を選び、
"DFMFormat" という名前の DWORD 値を作成します。値 は初期値の 0 のままにします。 
これでフォームファイルが Shift-JIS で保存されるようになります。
ただし、Windows 95 + Delphi 6 SP2 の環境では
フォームの 2 バイト文字が化けるバグがあります。
Windows 95 で Delphi 6 をお使いの方は
SP3 が出るまでは SP1 止まりにしておきましょう。

Delphi IDEでの矩形選択

ALTをおしながら選択すると矩形選択できます

RectSelection.png

Win2000タスクトレイの256色表示

情報源:
http://cyberfield.virtualave.net/
http://www.dr-hoiby.com/TrayIconIn256Color/index.html
Windows2000では、タスクトレイアイコンの表示色が16色なので、 256色以上のアイコンがきれいに表示できません。
が、Explorer.exeをバイナリエディタで書き換えると、256色にできます。 ここではWin2000sp3のものを書き換えます。

 name : explorer.exe
 size : 242960
 from : Windows 2000 build 5.00.2195 SP3 (JP)
 ver  : 5.0.3502.5321
 CRC  : 07B4
 CRC32: 34F4E3FD
 Offset 0x1CDE  : 01 -> 11
 Offset 0xD7E4  : 01 -> 11
 Offset 0x14CE9 : 01 -> 11
 Offset 0x14CFA : 01 -> 11

書き換え後のCRCは622D97B9(CRC32)になります。 これをオリジナルのExplorer.exeと置き換えればOK
置き換えがうまくいかなかったらコメントください。

Win2000sp4の場合はつぎのとおりです。

 ファイル名 : Explorer.exe
 サイズ     : 237 KB (243,472 バイト)
 バージョン : 5.0.3700.6690
 CRC        : 7679
 
  88EE : 01 → 11
 14E25 : 01 → 11
 14E36 : 01 → 11
 
 書き換え後のCRC  : 5795

Shift-JISかどうかの判定方法

まず、通常のチェックを入れる。その後、Shift-JISを有効にする場合、
以下の範囲かどうかをチェックする。
Chr(129)..Chr(159),Chr(224)..Chr(234)でShift-JISコードの2バイト文字は
始まるので、この範囲の文字の場合は次の1バイトをチェック対象からはずす。
それ以外の場合は、 不正ということにすればよい。

SlavaNapサーバーリンクの仕様(NET_BUILD=19)

SlavaNapサーバーリンク資料(NET_BUILD=19) 2003.08.09 usj12262@hotmail.com

■コマンド表

NET_BUILD=19のとき
920(MSG_CLIENT_BEFORELOGIN)
  書式: 00
8000(MSG_SRV_LOGIN)[CLIENT]
  書式: "<host>" <port> "<version>" "<net_build>" <handle> "<console>"
        "<cons_reg_user>" "<conslist>" "<handlelist>"
8001(MSG_SRV_LOGIN_ACK)[SERVER]
  書式: "<version>" <handle> <console> "<cons_reg_user>"
8008(MSG_SRV_SYNCCH)// channel sync
  書式: <channel> <n> <topic> <limit> <level> <state>
  備考: <state>は数字で指定する
8009(MSG_SRV_VOICE)// voice user in channel (done by server)
  書式: <channel> <nick> <handle> <IsOP(1|0)> <IsForwardAll(1|0)>
8010(MSG_SRV_OP)// op user in channel (done by server)
  書式: <channel> <nick> <handle> <IsOP(1|0)> <IsForwardAll(1|0)>
8011(MSG_SRV_SYNCSRV)[CLIENT]// sync linked server
  書式: <host> <port> "<version>" handle "<console>" <myhandle> <incoming> "<reg_user>"
8012(MSG_SRV_SYNCUSER)// sync user
  書式: "<nick>" "<pass>" "<soft>" "<level>" "<ip>" "<dataport>" "<totalup>"
        "<totaldown>" "<ul>" "<dl>" "<maxup>" "<queue>" "<speed>" "<shared>"
        "<server>" "<state>" "<lastseen>"
8013(MSG_SRV_PUBLICSYNCUSER)// sync user (sent to all servers)
  書式: "<nick>" "<pass>" "<soft>" "<level>" "<ip>" "<dataport>" "<totalup>"
        "<totaldown>" "<ul>" "<dl>" "<maxup>" "<queue>" "<speed>" "<shared>"
        "<server>" "<state>" "<lastseen>"
8017(MSG_SRV_UPDATEUSER)// update user data
  書式: "<nick>" "<totalup>" "<totaldown>" "<up>" "<down>" "<maxup>" "<queue>"
        "<speed>" "<shared>"
8023(MSG_SRV_SERVERBANCLEAR)// clear bans
  書式: empty
8024(MSG_SRV_SERVERBANSYNC)// sync ban
  書式: <nick!ip> "<admin>" <bantime> <expire> <lastattempt> "<lastnick>"
        <tries> "<reason>"
8025(MSG_SRV_REGISTEREDCLEAR)// sync regisreations start
  書式: empty
8026(MSG_SRV_REGISTEREDSYNC)// sync registrations
  書式: "<nick>" "<pass>" "<level>" "<totaldown>" "<totalup>" "<lastip>"
        "<lastseen>" "<state>" "<createdtime>" "<createdby>" "<lastsetby>"
8029(MSG_SRV_ALIAS)[CLIENT]// server alias
  書式: <host> "<alias>" "<1|0>"
8031(MSG_SRV_BLOCKLISTCLEAR)// clear blocked files list
  書式: empty
8032(MSG_SRV_BLOCKLISTSYNC)// sync blocked files list
  書式: <blockword1> [blockword2 [ blockword3 [...]]]

■サーバー接続のながれ

I.接続元:サーバー窓で接続ボタンを押す

TServer.Connect
  CreateConsoleList//ネットワークのコンソール・サーバーハンドルの
    リスト(自分を含む)を更新
  Self.thread:=TServerThread.Create(Self)

II.接続元:サーバー接続用スレッド開始
TServerThread.Execute
 srv.Exec(920,'00');//MSG_CLIENT_BEFORELOGIN=920
 8000を送信

III.接続先:メインスレッドでサーバーコマンド8000番を受けとる
TMainThread.Execute
  TMainThread.CheckServers
    TServer.Flush
    TServer.Receive
      ProcessServerCommand(Self)
        ProcessRemoteUserCommand// gcmd.id=8000の場合
          ProcessCommand
            Handler_ServerLogin// ここでNET_BUILDのチェック
              Handler_LinkServer
                800を送信
                TServer.Flush
                CompleteSyncServer(srv,1)//1なら8000を受けた側。0なら8000を送った側。
                  8011,8029を送信
                  SyncServers(srv,srv2)
                    8011,8029を送信
                    SyncServers(srv,srv3)(db_servers.count繰り返し)
                  8023,8024を送信(srv.incoming=Trueの場合のみ)
                  8031,8032を送信(srv.incoming=Trueの場合のみ)
                  8025,8026を送信(srv.incoming=Trueの場合のみ,
                                    8026は登録ユーザーの数だけ繰り返し)
                  CompleteSyncUser(srv,user2)
                    if srv<>nil then 8012を送信 else 8013を送信
                  UpdateUser(user2,srv);
                    8017を送信
                  8008を送信
                  WriteAllServersEx(srv,MSG_CLIENT_JOIN,
                    user2^.username,ch.channel)//400
                  if ch.Operator(user2) then 8010を送信
                  else if (chModerated in ch.state) and
                    StrHash_FindString(ch.voices,
                      user2^.username,true) then 8009を送信
                  214を送信
      SERVER_MAX_RECEIVE_RECURSE(=10)回までReceiveを繰り返す
    TServer.Flush

Redirectサーバの仕様(独自調査のため正式な仕様とは違うかもしれません)

Redirectサーバは、使用するポートをあらかじめListenしています。
クライアントがRedirectサーバにTCP接続をかけます。
Redirectサーバはサーバのアドレスをクライアントに
「最初に接続したTCPの接続」で送信します(書式:「サーバアドレス:ポート#13」)
Redirectサーバ側からTCP接続をクローズします。
クライアントは送信されてきたアドレスに接続を行います。

Redirectが送信するアドレスはホスト名でもIPアドレスでもかまいません。

なお、WinMXでの「OPENNAP***(REDIRECT)」は、
OPENNAPのバージョンに対する互換のことなので、どれでもいいかと(SlavaNapの場合)

クライアント判定

WinMX の仕様を調べたいのですが資料が少なく、ここでお聞きしてもかまいませんか。 リモートキューの方法とログイン時の挙動はこんな感じでOKでしょうか。by heavy_baby

リモートキューってあんまり確かめたことないけど、 キューの限界のところって、たしかにこういうかんじかもしれないですね!
2.6から3.3へはキューがいれられないというのを聞いたことがあるのと、
WantQueueは相手によって送られないこともあるとも聞いたような

WinMX 2.6 Remote Queue Requester

203	download request [CLIENT]
620	queue limit [SERVER]
	<nick> "<filename>" <n>
	if <n> = 0 then "busy queueble"
205	private message to another user [CLIENT]
	<nick> "//WantQueue"
203	download request [CLIENT]
620	queue limit [SERVER]
	<nick> "<filename>" <n>
	"queued at <n>"

ダウンロード可能かの確認は一定時間ごとに
205	private message to another user [CLIENT]
	<nick> "//WantQueue"
203	download request [CLIENT]
を発信するようです。(thx! #Rufuさん)

WinMX 3.3 Remote Queue Requester

203	download request [CLIENT]
620	queue limit [SERVER]
	<nick> "<filename>" <n>
	if <n> > 999 then "busy queueble"
205	private message to another user [CLIENT]
	<nick> "//WantQueue"
203	download request [CLIENT]
620	queue limit [SERVER]
	<nick> "<filename>" <n>
	"queued at <n>"

2get Login

2	login [CLIENT]
3	login ack [SERVER]
621	message of the day [SERVER]
214	server stats [SERVER]
870	add files by directory [CLIENT]
208	hotlist [CLIENT]
209	hotlist [SERVER]
326	clear ignore list [CLIENT]
326	clear ignore list [SERVER]
700	change link speed [CLIENT]
ping に対して pong で応答する
MD5は32バイトの小文字英数
5分おきにキューの更新をする
共有ファイルのパスにコロンを含まない

WinMX3.3とWinMX2.6の違い

http://tmp.2ch.net/test/read.cgi/download/1032973542/509

509 :ナナシサソ :02/10/21 17:33 ID:pAm9bIOw
3.3と2.6のログイン時のログとってみますた
コマンド番号とその詳細はSlavaNapに入ってるnap.txt見るなりで

このように違いがあるので、クライアント申告偽っても弾ける可能性あり
改造してる人頑張って(漏れはコーディング出来ないので)

WinMX3.3とWinMX2.6の違い(ログイン時)

3.3
Hotlistはコマンド207で処理している
Received command [207] "USER2" (USER1, WinMX v3.3, 127.0.0.1)
Sending command [301] "USER2" (USER1, WinMX v3.3, 127.0.0.1)

2.6
Hotlistはコマンド208で処理している
Received command [208] "USER2" (USER1, WinMX v2.6j, 127.0.0.1)

無視リストの処理をしている(コマンド326)
Received command [326] "" (USER1, WinMX v2.6j, 127.0.0.1)
Sending command [326] "0" (USER1, WinMX v2.6j, 127.0.0.1)

回線速度申告の処理をしている(コマンド700)
Received command [700] "1" (USER1, WinMX v2.6j, 127.0.0.1)