めくら鉄砲

あるツールのプラグインはwin32 dll になっているんだけど、僕のやりたい部分だけサポートされていないみたい。しかし実際既存dllはあるわけだから、きっと方法はあるんだろう。自社内でなにやってんだとか、多少腰砕けなんだけど、ツール製作部署に質問かけてみた。そしたら、「僕知らないから、メール転送。はいあんた達答えといてね」というたらい回しリプライされて、その対象がマネージャーな方々(二人以上に送るときは責任かけるほうを明示しろっつーの)だったので嫌な予感したんだけど、予想通りというか中々にナシのツブテなので「のろまに付き合ってランねーよ」「お忙しいマネージャの方をあまり困らせてはいけないな」とか思い、バカハックを続けている。

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	LPCWSTR fname = TEXT("IODLL\\IodllForCMT.dll");

	HMODULE l = LoadLibrary(fname);

	FARPROC sam = GetProcAddress(l, "GetModuleCount");
	printf("%d\n", sam());
	
	return 0;
}

こんなので連射しまくっているけど中々当たらないなあ。副作用でCreateRemoteThread()を勉強した。なんという恐ろしいAPIだ。
あと psapiとか。今までプロセス一覧を出すとき古臭い方法(ToolHelp32を使う方法)しかしらなかったんだけれど、こんな方法があったのかっていうかやっぱり MSってばカオス*1

#include <psapi.h>

_tmain(...) 
{
	DWORD id[1024];
	DWORD bsize;
	HMODULE mods[1024];
	WCHAR name[1024];

	EnumProcesses(id, sizeof(id), &bsize);
	for (DWORD i = 0; i< bsize; i++) {
		HANDLE h ;
		if (( h = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, id[i]) ) !=NULL) {
			if (EnumProcessModules(h, mods, sizeof(mods), &bsize) != FALSE) {
				GetModuleBaseName(h, mods[0], name, sizeof(name));
				wprintf(_T("%s\n"), name);
			}
		}
	}
}

*1:折角のイテレータ方式(nextでたどる)で効率的だったのを態々一挙にげとーに変えるという。まあプロセス程度なら最近のマシンは恐ろしいほどメモリがあるのでどうでも良いのかもしれませんが。実際MSDNを見ると「バッファが小さすぎてすべてのプロセス識別子を格納できなくても、それを示す手段はありません。」とか。萎える。良い子はなるべくMSと付き合わないほうが良い気がする×無限大