Win32APIについての質問はこちらへどうぞ。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
■過去スレ
Win32API質問箱 Build125
https://mevius.5ch.net/test/read.cgi/tech/1551247748/
Win32API質問箱 Build124
https://mevius.5ch.net/test/read.cgi/tech/1510395780/
■関連スレ
Visual Studio 2019 Part4 https://mevius.5ch.net/test/read.cgi/tech/1585715794/
Visual Studio 2017 Part7 https://mevius.5ch.net/test/read.cgi/tech/1558179898/
【C++】 DirectX初心者質問スレ Part41 【C】 https://mevius.5ch.net/test/read.cgi/tech/1521786252/
Win32API質問箱 Build126
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/05/01(金) 22:16:51.96ID:ZJ42fMZB574デフォルトの名無しさん
2021/05/30(日) 09:45:29.63ID:LN/prPAP575デフォルトの名無しさん
2021/05/30(日) 10:42:53.61ID:ssDmNHo+ PPAPは馬鹿っぽい
576デフォルトの名無しさん
2021/05/30(日) 16:45:35.69ID:PqG+8+2Y577デフォルトの名無しさん
2021/05/30(日) 20:56:15.06ID:WEq4SBwj それはプリンタDCを使って印刷するんだべ
570でそれは否定されているぞ
570でそれは否定されているぞ
578デフォルトの名無しさん
2021/05/30(日) 20:57:42.71ID:p+VrCgXk579デフォルトの名無しさん
2021/05/31(月) 16:22:50.06ID:XbQeT4fa ReadDirectoryChangesExWでroutine渡して非同期フォルダ監視してるんだけど、これって通知来るたびに一回一回登録し直さないといけないの?
通知 → 登録し直しの間は監視漏れが発生しうるって事だよね?
通知 → 登録し直しの間は監視漏れが発生しうるって事だよね?
580デフォルトの名無しさん
2021/05/31(月) 16:52:07.49ID:3RgsPXyf http://eternalwindows.jp/shell/shellname/shellname06.html
https://www.usefullcode.net/2007/01/post_45.html
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shchangenotifyregister
https://docs.microsoft.com/ja-jp/windows/win32/fileio/obtaining-directory-change-notifications
https://www.usefullcode.net/2007/01/post_45.html
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shchangenotifyregister
https://docs.microsoft.com/ja-jp/windows/win32/fileio/obtaining-directory-change-notifications
581蟻人間 ◆T6xkBnTXz7B0
2021/06/01(火) 02:10:15.60ID:Rxn2JXc8 どうやらDeleteFile関数はナイフのように危険な関数と見なされているらしい。使うのはためらうがいい。
582デフォルトの名無しさん
2021/06/01(火) 03:20:20.18ID:iJwujeZa 詳しく
583デフォルトの名無しさん
2021/06/01(火) 16:25:48.20ID:IAoswQIc 思わせぶりなんやな
584デフォルトの名無しさん
2021/06/01(火) 16:31:57.56ID:29GPvfIS >>580
完璧に監視したいならカーネルドライバ仕込むしかなさそうか
完璧に監視したいならカーネルドライバ仕込むしかなさそうか
585デフォルトの名無しさん
2021/06/02(水) 04:00:06.74ID:CFdyIdLe 完璧かどうか忘れたが、登録し直しなんてやった記憶ないな
586デフォルトの名無しさん
2021/06/02(水) 11:14:04.96ID:qtmfAhQ7 登録し直しなんてやった記憶無いし
しなくても通知は来ることは来るけど
ちゃんとしてても普通に取りこぼすことはあった気がする
しなくても通知は来ることは来るけど
ちゃんとしてても普通に取りこぼすことはあった気がする
587デフォルトの名無しさん
2021/06/03(木) 00:06:10.42ID:mgPJdS86 >>585>>586
それはSHChangeNotifyRegisterの話?
もしくはReadDirectoryChangesExWでもIO完了ポートで受け取る方式なら継続的になるとか?
完了ポートでの非同期IQはややこしそうだからとスルーしていたが
それはSHChangeNotifyRegisterの話?
もしくはReadDirectoryChangesExWでもIO完了ポートで受け取る方式なら継続的になるとか?
完了ポートでの非同期IQはややこしそうだからとスルーしていたが
588デフォルトの名無しさん
2021/06/03(木) 19:50:54.55ID:smLJNlVA >>587
585だけど昔のソース見たら専用スレッドで下みたいなことしてた。登録し直してるわ
OVERLAPPED ol;
ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
for (;;) {
bRet = ReadDirectoryChangesW( hDir, buffer, buffer_size, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME |FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_SIZE |FILE_NOTIFY_CHANGE_CREATION|FILE_NOTIFY_CHANGE_SECURITY
, &dwByte, &ol, NULL);
ol.hEvent を WaitForMultipleObjects で待つ
bRet = GetOverlappedResult(hDir, &ol, &dwByte, TRUE );
for (;;) {
pInfo = (FILE_NOTIFY_INFORMATION *)&buffer[i];
別スレッドの待ち行列に追加
if (pInfo->NextEntryOffset == 0)
break;
i += pInfo->NextEntryOffset;
}
}
585だけど昔のソース見たら専用スレッドで下みたいなことしてた。登録し直してるわ
OVERLAPPED ol;
ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
for (;;) {
bRet = ReadDirectoryChangesW( hDir, buffer, buffer_size, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME |FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_SIZE |FILE_NOTIFY_CHANGE_CREATION|FILE_NOTIFY_CHANGE_SECURITY
, &dwByte, &ol, NULL);
ol.hEvent を WaitForMultipleObjects で待つ
bRet = GetOverlappedResult(hDir, &ol, &dwByte, TRUE );
for (;;) {
pInfo = (FILE_NOTIFY_INFORMATION *)&buffer[i];
別スレッドの待ち行列に追加
if (pInfo->NextEntryOffset == 0)
break;
i += pInfo->NextEntryOffset;
}
}
589デフォルトの名無しさん
2021/06/07(月) 03:29:32.93ID:N0vu82AX タッチスクリーンとして扱われる入力デバイスがあるのですが、これをマウスのように扱いたいです。
具体的に言うと、ブラウザ等のアプリ上でWM_POINTERDOWNが発生した時点でマウスの左クリックと同等の動きをさせ、POINTERDOWN以外のWM_POINTER系メッセージを握り潰したいです。
SetWindowsHookEx()で、起動中の各アプリケーションに対して自作dll内のフックプロシージャをインストールしたのですが、下記StackOverflowの投稿と同じ状態になって詰まっています。
https://stackoverflow.com/questions/21069643/is-it-possible-to-remove-touch-messages-wm-pointerdown-etc-that-an-applicatio
フックタイプにWH_CALLWNDPROCを指定すればメッセージの握り潰しや書き換えができるようなのですが、その場合どのようなウィンドウメッセージをフックすれば良いのでしょうか?
具体的に言うと、ブラウザ等のアプリ上でWM_POINTERDOWNが発生した時点でマウスの左クリックと同等の動きをさせ、POINTERDOWN以外のWM_POINTER系メッセージを握り潰したいです。
SetWindowsHookEx()で、起動中の各アプリケーションに対して自作dll内のフックプロシージャをインストールしたのですが、下記StackOverflowの投稿と同じ状態になって詰まっています。
https://stackoverflow.com/questions/21069643/is-it-possible-to-remove-touch-messages-wm-pointerdown-etc-that-an-applicatio
フックタイプにWH_CALLWNDPROCを指定すればメッセージの握り潰しや書き換えができるようなのですが、その場合どのようなウィンドウメッセージをフックすれば良いのでしょうか?
590デフォルトの名無しさん
2021/06/12(土) 10:06:00.61ID:AjrJ9Ngk このスレでいいのか判りませんが質問です。
WindowsのタブレットはUSBマウス等のポインティングデバイスを差さないとマウスカーソルが表示されないのですが、
APIか何かでマウスカーソルを表示させる方法ってありませんか?
タブレットでSendInputで自動操作させる時にマウスカーソルが表示されず、何が起こっているのか判らないので何とかしたいです。
kokomiteみたいなソフトも試しましたが、ログイン前とかでは使えないので他の方法がないか探しています。
WindowsのタブレットはUSBマウス等のポインティングデバイスを差さないとマウスカーソルが表示されないのですが、
APIか何かでマウスカーソルを表示させる方法ってありませんか?
タブレットでSendInputで自動操作させる時にマウスカーソルが表示されず、何が起こっているのか判らないので何とかしたいです。
kokomiteみたいなソフトも試しましたが、ログイン前とかでは使えないので他の方法がないか探しています。
591デフォルトの名無しさん
2021/06/12(土) 14:25:29.90ID:EUQ7Uxqr マウスジグラーを繋ぐとかは抜きなら
DDKじゃね
DDKじゃね
592デフォルトの名無しさん
2021/06/12(土) 14:30:19.46ID:5buAbQHn SetProp(), GetProp() っていつごろからあるんだろう?
これらの関数の存在を最近まで知らなかった
これらの関数の存在を最近まで知らなかった
593デフォルトの名無しさん
2021/06/12(土) 14:35:57.37ID:oXB7qEBX >>592
Windows 2000
Windows 2000
594デフォルトの名無しさん
2021/06/12(土) 15:21:40.84ID:5buAbQHn595蟻人間 ◆T6xkBnTXz7B0
2021/06/12(土) 18:39:01.20ID:bymgAWyc SetProp/GetPropはstd::mapみたいに使えて便利だが、システムやアプリが無断で勝手に使う関係ないデータが交じる恐れがあるから注意。
>>594
WindowClass.cbClsExtra や WindowClass.cbWndExtra にポインタのサイズを登録しておいて、
::CreateWindow(..., this)
::SetWindowLong()/::SetWindowLongPtr()
::GetWindowLong()/::GetWindowLongPtr()
とかをやる手法は win3.1 からあったと記憶しています
>>593,592
https://docs.microsoft.com/en-us/windows/win32/winmsg/using-window-properties
を初めてみていますが、Window Properties とはどういう概念でしょうか?みたところ上記の api 群が扱うオブジェクトとは違うようですが
WindowClass.cbClsExtra や WindowClass.cbWndExtra にポインタのサイズを登録しておいて、
::CreateWindow(..., this)
::SetWindowLong()/::SetWindowLongPtr()
::GetWindowLong()/::GetWindowLongPtr()
とかをやる手法は win3.1 からあったと記憶しています
>>593,592
https://docs.microsoft.com/en-us/windows/win32/winmsg/using-window-properties
を初めてみていますが、Window Properties とはどういう概念でしょうか?みたところ上記の api 群が扱うオブジェクトとは違うようですが
597デフォルトの名無しさん
2021/06/12(土) 20:53:52.52ID:5buAbQHn598590
2021/06/13(日) 08:15:12.76ID:qn2LXnlL >>591
>マウスジグラー
こういう製品があるんですね。ご紹介ありがとうございます。
ただ、機能の割にお値段が結構するみたいなので、無線マウスのドングルでも繋いどけばよさそうですね。
仮想マウスドライバの作成も検討してみます。
ありがとうございました。
>マウスジグラー
こういう製品があるんですね。ご紹介ありがとうございます。
ただ、機能の割にお値段が結構するみたいなので、無線マウスのドングルでも繋いどけばよさそうですね。
仮想マウスドライバの作成も検討してみます。
ありがとうございました。
599デフォルトの名無しさん
2021/06/13(日) 14:01:31.30ID:oB3VpSlH SetCursorでダメなん
600デフォルトの名無しさん
2021/06/14(月) 01:35:24.65ID:CyJY6/R2 >>599
SetCursor、ShowCursorを試してみましたがだめなようです。
マウスカーソルがが表示されない状態の簡単な再現方法ですが、
Windows10が入った適当なデスクトップPCにマウス等を繋がずに起動するとこの状態になるようです。
SetCursor、ShowCursorを試してみましたがだめなようです。
マウスカーソルがが表示されない状態の簡単な再現方法ですが、
Windows10が入った適当なデスクトップPCにマウス等を繋がずに起動するとこの状態になるようです。
601デフォルトの名無しさん
2021/06/14(月) 10:46:03.90ID:wsn+oRmt GetTickCount()
東京五輪期間中の49日間、在宅勤務を求めた政府に「不吉」の声 - ライブドアニュース
https://news.livedoor.com/article/detail/20359990/
東京五輪期間中の49日間、在宅勤務を求めた政府に「不吉」の声 - ライブドアニュース
https://news.livedoor.com/article/detail/20359990/
602デフォルトの名無しさん
2021/06/14(月) 14:11:06.25ID:u1SE1Un5 もともとテレワークだから関係ないけど
夏期休暇中にバリバリ旅行する予定は入れてるな
ハハハ
夏期休暇中にバリバリ旅行する予定は入れてるな
ハハハ
603デフォルトの名無しさん
2021/06/14(月) 20:25:26.99ID:wsn+oRmt 49.7日間で終わるのが嫌ならGetTickCount64()を使えばいい
604デフォルトの名無しさん
2021/06/14(月) 21:41:37.22ID:hyIjE3NB 今さらだがGetTickCountで四十九日という考え方をしたことないけど、覚え方としてはありか
605デフォルトの名無しさん
2021/06/14(月) 21:44:55.35ID:00nQT5bL 95時代から何度もトラブルを起こしている
49日deathと名前が付くぐらいだし
49日deathと名前が付くぐらいだし
606590
2021/06/14(月) 21:54:18.56ID:CyJY6/R2 次の設定でマウスカーソルが表示できました。
Windowsの設定 → 簡単操作 → マウス → マウスをキーパッドで操作する : オン
または下のレジストリ設定後、一度ログアウトし再度ログオンする。
rem マウスオン
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
rem マウスオフ
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "158" /f
レジストリ設定の場合、一度ログアウトが必要なのが解せませんが、これで一応ソフトウェアでカーソルの表示まではできました。
Windowsの設定 → 簡単操作 → マウス → マウスをキーパッドで操作する : オン
または下のレジストリ設定後、一度ログアウトし再度ログオンする。
rem マウスオン
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
rem マウスオフ
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "158" /f
レジストリ設定の場合、一度ログアウトが必要なのが解せませんが、これで一応ソフトウェアでカーソルの表示まではできました。
607590
2021/06/14(月) 22:00:24.26ID:CyJY6/R2 なお、ログオフ前もマウスカーソルを表示させたい場合はHKU\.DEFAULTに設定すれば良いようです。
reg add "HKU\.DEFAULT\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
とりあえずこれで大丈夫かな?
reg add "HKU\.DEFAULT\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
とりあえずこれで大丈夫かな?
608デフォルトの名無しさん
2021/06/15(火) 20:39:42.52ID:yNzX82gi609デフォルトの名無しさん
2021/06/18(金) 04:52:47.87ID:G04bvGTj こんにちは。
C++ でSDIウィンドウを管理するためのラッパークラスを作っているのですが、
正直、継承クラスを作成してウィンドウをカスタマイズするたびに新しい
ウィンドウクラス名を指定する作業が面倒くさいです。当初は
string SDIWindow::get_wndclass_name() const {return typeid(*this).name();}
このような仮想関数を用意していたのですが、std::typeid::name() の返却値は実装依存で、
空文字すら返すことがあると聞き、ボツ案になりました。どうにかウィンドウクラス名を
自動生成したいのですが、妙案はありませんでしょうか。MFCなどのツールではどのように
名前を付けているのでしょう?よろしくお願いいたします。
C++ でSDIウィンドウを管理するためのラッパークラスを作っているのですが、
正直、継承クラスを作成してウィンドウをカスタマイズするたびに新しい
ウィンドウクラス名を指定する作業が面倒くさいです。当初は
string SDIWindow::get_wndclass_name() const {return typeid(*this).name();}
このような仮想関数を用意していたのですが、std::typeid::name() の返却値は実装依存で、
空文字すら返すことがあると聞き、ボツ案になりました。どうにかウィンドウクラス名を
自動生成したいのですが、妙案はありませんでしょうか。MFCなどのツールではどのように
名前を付けているのでしょう?よろしくお願いいたします。
610デフォルトの名無しさん
2021/06/18(金) 11:13:45.48ID:jgOXgIk3612デフォルトの名無しさん
2021/06/18(金) 20:14:25.45ID:Y3n+d/Ne ATLはオブジェクトのアドレスだったような
613609
2021/06/19(土) 01:33:45.59ID:zlIXB2NK ご回答くださった方々、ありがとうございます。
__func__ これだ、と思ったのですが、いま使用しているコンパイラが相当古く、
この機能をサポートしていないようです。何かうまい方法がないかもう少し考えてみます。
>>612
自分もオブジェクトのアドレスを利用できないかと考えていたのですが、インスタンスごとに
アドレスが異なると困るのではと思い、保留していました。
__func__ これだ、と思ったのですが、いま使用しているコンパイラが相当古く、
この機能をサポートしていないようです。何かうまい方法がないかもう少し考えてみます。
>>612
自分もオブジェクトのアドレスを利用できないかと考えていたのですが、インスタンスごとに
アドレスが異なると困るのではと思い、保留していました。
614デフォルトの名無しさん
2021/06/19(土) 05:54:37.84ID:IUR6A6FI uid、guid生成すんのがトレンド
615デフォルトの名無しさん
2021/06/19(土) 13:13:08.67ID:tbYH3ICf コンストラクタの呼び出し位置で __FILE__と__LINE__を使った文字列をセットするとか
616609
2021/06/19(土) 15:58:26.49ID:zlIXB2NK >>614-615
ありがとうございます。
なるほど! __FILE__, __LINE__ の組み合わせは盲点でした。
これなら確かに、オブジェクトとウィンドウクラスを1対1で対応させることができますね。
少なくとも当座はこれでしのげます。
uid、guid 案もありがとうございます。
知識不足のため、勉強してから考えてみたいと思います。
ありがとうございます。
なるほど! __FILE__, __LINE__ の組み合わせは盲点でした。
これなら確かに、オブジェクトとウィンドウクラスを1対1で対応させることができますね。
少なくとも当座はこれでしのげます。
uid、guid 案もありがとうございます。
知識不足のため、勉強してから考えてみたいと思います。
617デフォルトの名無しさん
2021/06/19(土) 16:18:13.72ID:BH9bYKW9 ウインドウクラス名は文字列の他にATOMでも指定できる
ATOMはRegisterClass()が返す
ATOMはRegisterClass()が返す
618デフォルトの名無しさん
2021/07/09(金) 07:17:28.46ID:Qg7nE9lI dllmainの最初の引数のHMODULEっていうかハンドルと同じ値を取得するwin32apiある?
ライブラリ作ってるけど、dllmain自体をライブラリに含めたくないから困ってる。
dllmainからHMODULEをライブラリに渡せ
みたいな変な規則も出来れば避けたい...
ライブラリ作ってるけど、dllmain自体をライブラリに含めたくないから困ってる。
dllmainからHMODULEをライブラリに渡せ
みたいな変な規則も出来れば避けたい...
619デフォルトの名無しさん
2021/07/09(金) 07:19:48.14ID:If26C/4W GetModuleHandle(NULL)をキャストしる
620デフォルトの名無しさん
2021/07/09(金) 07:50:25.45ID:Qg7nE9lI GetModuleHandleのNULLは大元の実行ファイルのパス。
そうじゃなくて.dllのパスが欲しい。
その際dllmainの第一引数を使わない形で欲しい。
そうじゃなくて.dllのパスが欲しい。
その際dllmainの第一引数を使わない形で欲しい。
621デフォルトの名無しさん
2021/07/09(金) 08:17:41.20ID:r/5b40UG んでリンカーでエントリーポイントを自前のにしつつ
コンパイラのスタートアップに渡す過程で hInst をくすねるしかないんじゃないの?
コンパイラのスタートアップに渡す過程で hInst をくすねるしかないんじゃないの?
622620
2021/07/09(金) 08:53:28.23ID:Qg7nE9lI 定義関数自身を渡しつつ、リファレンスカウンタを増やすのを回避する以下の形でいけるっぽい。
HMODULE GetCurrentModule()
{
DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
HMODULE h = 0;
::GetModuleHandleEx(flags, reinterpret_cast<LPCTSTR>(GetCurrentModule), &h);
return h;
}
HMODULE GetCurrentModule()
{
DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
HMODULE h = 0;
::GetModuleHandleEx(flags, reinterpret_cast<LPCTSTR>(GetCurrentModule), &h);
return h;
}
623デフォルトの名無しさん
2021/07/09(金) 11:00:40.24ID:r/5b40UG そのライブラリを利用して
dll を記述するときは dll 自身を指して
アプリケーションを記述するときは実行ファイル自身を指すと
(GetModuleHandle() は、常に実行ファイルを指す)
dll を記述するときは dll 自身を指して
アプリケーションを記述するときは実行ファイル自身を指すと
(GetModuleHandle() は、常に実行ファイルを指す)
624デフォルトの名無しさん
2021/07/09(金) 12:53:16.14ID:If26C/4W Module32First でも使えば〜
625デフォルトの名無しさん
2021/07/09(金) 16:42:11.88ID:egaI+P/a >>618
DLLは、アプリと同じ仮想アドレス空間を共有しており、HMODULEの値は、
DLLの PE イメージの先頭アドレスだと聞いている。
そして、DLLは単なる関数の集まりに過ぎないので、「現在のDLL」という
概念が存在しない。
dllmain が呼び出されて、OSに戻るまでの間の時間、現在どの dllmain が呼び出されているか、
という情報なら OSはどこかに持っているはずではあるが。
なお、DLLの関数群は、通常、dllmain が呼び出されている間以外に使うことが原則。
DLLは、アプリと同じ仮想アドレス空間を共有しており、HMODULEの値は、
DLLの PE イメージの先頭アドレスだと聞いている。
そして、DLLは単なる関数の集まりに過ぎないので、「現在のDLL」という
概念が存在しない。
dllmain が呼び出されて、OSに戻るまでの間の時間、現在どの dllmain が呼び出されているか、
という情報なら OSはどこかに持っているはずではあるが。
なお、DLLの関数群は、通常、dllmain が呼び出されている間以外に使うことが原則。
626デフォルトの名無しさん
2021/07/10(土) 05:25:42.40ID:fmB/UGP2 dllは現在実行中のdllという概念はあるのでは。
あるからこそ、c++/cliでは簡単かつ確実なものとして提供されてるわけで。
あるからこそ、c++/cliでは簡単かつ確実なものとして提供されてるわけで。
627デフォルトの名無しさん
2021/07/10(土) 05:59:03.94ID:fmB/UGP2 あと、現在実行中のニーモニックのアドレスより若い直近アドレスに位置するモジュールのエントリーアドレスであればそれが求めるものだし。
620は関数定義が属するdllのハンドルを得る関数になってるから、実用上問題なく機能するよね。
620は関数定義が属するdllのハンドルを得る関数になってるから、実用上問題なく機能するよね。
628デフォルトの名無しさん
2021/07/10(土) 06:50:44.17ID:JLp3Oijw そもそもDllMainのHMODULEを使わないって縛りプレイでのお話でおすし
629デフォルトの名無しさん
2021/07/10(土) 09:10:30.89ID:e+Cu97LZ630デフォルトの名無しさん
2021/07/10(土) 09:18:08.53ID:CnbTxKRZ631デフォルトの名無しさん
2021/07/10(土) 09:39:49.89ID:e+Cu97LZ632デフォルトの名無しさん
2021/07/10(土) 09:41:14.25ID:e+Cu97LZ633デフォルトの名無しさん
2021/07/10(土) 09:41:47.91ID:e+Cu97LZ634デフォルトの名無しさん
2021/07/10(土) 09:43:15.11ID:MJuwQyYP tool help 32
635デフォルトの名無しさん
2021/07/10(土) 11:50:04.86ID:fmB/UGP2 いや実行中のステップがどのdllかという概念はあるよ。
あるからデバッガでも今の瞬間実行中のステップがどの.dllのどのアドレスかまでわかってるわけで。
あるからデバッガでも今の瞬間実行中のステップがどの.dllのどのアドレスかまでわかってるわけで。
636デフォルトの名無しさん
2021/07/10(土) 11:56:56.14ID:6bm+w6Lu >>635
それをOSが管理してるか?って話だろ
それをOSが管理してるか?って話だろ
637デフォルトの名無しさん
2021/07/10(土) 12:01:47.23ID:fmB/UGP2 各々dllのベースアドレスは管理してるんだから、管理してるだろ。
管理してるかはdllは解放されるんだろ?
ベースアドレスからファイル名が辿れるから何のファイルか解るようになってるんやないか。
だからぶっ飛ぶとシステムログに飛んだdll名が明記されるやないか。
管理してるかはdllは解放されるんだろ?
ベースアドレスからファイル名が辿れるから何のファイルか解るようになってるんやないか。
だからぶっ飛ぶとシステムログに飛んだdll名が明記されるやないか。
638デフォルトの名無しさん
2021/07/10(土) 13:28:51.32ID:nAGZi/ZP 本当に飛躍した話が好きだよなおまえ達は
639デフォルトの名無しさん
2021/07/10(土) 13:41:35.94ID:fmB/UGP2 GetModuleHandleExの仕様をみればOSの管理下にあるのわかるじゃん。
2番目の引数には。モジュールのパスでもよいが、
「モジュール内の任意のアドレス」でもいいわけ。
即ち今プログラムでましに実行中位置であるEIPレジスタやRIPレジスタの値から
dllなりexeなりのハンドルがとれると書いてあるわけで。
もちろんハンドルがとれるからファイルのパスもわかる。
管理下になかったらどうやって取れるんだってのw
2番目の引数には。モジュールのパスでもよいが、
「モジュール内の任意のアドレス」でもいいわけ。
即ち今プログラムでましに実行中位置であるEIPレジスタやRIPレジスタの値から
dllなりexeなりのハンドルがとれると書いてあるわけで。
もちろんハンドルがとれるからファイルのパスもわかる。
管理下になかったらどうやって取れるんだってのw
640蟻人間 ◆T6xkBnTXz7B0
2021/07/10(土) 14:24:30.76ID:aRchcoDj ReactOSでGetModuleHandleExWをたどってみると次のようになる:
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L866
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L716
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L767
https://github.com/reactos/reactos/blob/20c1da7963debb69a46cf9f19f3e4c5e504c7fc9/ntoskrnl/rtl/libsupp.c#L34
https://github.com/reactos/reactos/blob/3fa57b8ff7fcee47b8e2ed869aecaf4515603f3f/ntoskrnl/ke/bug.c#L41
PLDR_DATA_TABLE_ENTRY構造体でプロセスの空間を保持しているようだ。
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L866
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L716
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L767
https://github.com/reactos/reactos/blob/20c1da7963debb69a46cf9f19f3e4c5e504c7fc9/ntoskrnl/rtl/libsupp.c#L34
https://github.com/reactos/reactos/blob/3fa57b8ff7fcee47b8e2ed869aecaf4515603f3f/ntoskrnl/ke/bug.c#L41
PLDR_DATA_TABLE_ENTRY構造体でプロセスの空間を保持しているようだ。
641デフォルトの名無しさん
2021/07/10(土) 15:12:39.28ID:fOJ6OsHP642デフォルトの名無しさん
2021/07/10(土) 15:26:13.52ID:fmB/UGP2 でも結局CPUの命令アドレスからdll名を求められるから、
今CPUが実行中のdllやexeはOSが管理してるし、それ用のwin32apiも提供されている、であってるやん。
今CPUが実行中のdllやexeはOSが管理してるし、それ用のwin32apiも提供されている、であってるやん。
643デフォルトの名無しさん
2021/07/10(土) 15:45:03.11ID:iYY30g0K どこを実行中かをOSが管理してるなら、暴走なんてせんわな
デバッガはbreakしたらやってるだけ
デバッガはbreakしたらやってるだけ
644デフォルトの名無しさん
2021/07/10(土) 16:12:20.61ID:6bm+w6Lu645デフォルトの名無しさん
2021/07/10(土) 16:44:08.48ID:fmB/UGP2 プロセス単位でexeやdllのアドレスを簡易的に言えば配列のように保持してて
あとはEIPが配列のインデックスであるかのように実行時に動くだけだから管理できてるじゃん。
indexに幅があるってだけでしょ。
あとはEIPが配列のインデックスであるかのように実行時に動くだけだから管理できてるじゃん。
indexに幅があるってだけでしょ。
646デフォルトの名無しさん
2021/07/10(土) 17:41:11.37ID:fOJ6OsHP647デフォルトの名無しさん
2021/07/10(土) 17:43:28.93ID:plgO0oJb 激重OSになりそう
648デフォルトの名無しさん
2021/07/10(土) 18:58:44.17ID:fmB/UGP2 いったいいつ関数の話になったんだ。
EIPからいつでもモジュールを辿れる形でプロセス情報を保持してるから管理されてると言ってるんだが。
プロセス情報を保持してないなら管理してないと言えるが。
EIPからいつでもモジュールを辿れる形でプロセス情報を保持してるから管理されてると言ってるんだが。
プロセス情報を保持してないなら管理してないと言えるが。
649デフォルトの名無しさん
2021/07/10(土) 19:18:42.88ID:fmB/UGP2 管理されてるを監視してるに勝手に脳内で置き換えてないやろな?
650デフォルトの名無しさん
2021/07/11(日) 00:19:00.34ID:5nx6GB9W でそれを取得するAPIは?
651デフォルトの名無しさん
2021/07/11(日) 03:01:15.31ID:OgOa7vqd 管理されているというより、EIPアドレスから逆算しているという感じだね。
実行中のマシン語の命令のアドレスが分かれば、リンク時のマップファイルのような
情報があれば、どの関数の中のマシン語かまで分かるから。
実行中のマシン語の命令のアドレスが分かれば、リンク時のマップファイルのような
情報があれば、どの関数の中のマシン語かまで分かるから。
652デフォルトの名無しさん
2021/07/11(日) 03:07:37.40ID:OgOa7vqd どの人がどこにいるかを国は普段は追跡してないけど、科学捜査すればどこにいるか
分かることが多いと言う意味で、「管理はしてなくても見抜くことは出来る」
のと同様の事。
分かることが多いと言う意味で、「管理はしてなくても見抜くことは出来る」
のと同様の事。
653デフォルトの名無しさん
2021/07/11(日) 03:11:46.75ID:OgOa7vqd >>649
各DLLがロードされている場所のアドレス範囲とEIPさえあれば、そりゃ、どのDLL
にいるかは分かるけれど、それは管理とは言わないと思うな。
マシン語で、jmp アドレス、call アドレス で、1クロックですぐに EIP = アドレス
になるが、それをOSはいちいち追跡も管理も全くしていない。だから、
現在どのDLLの関数を実行中かをOSは情報としては持ってない。
ところが、EIPの値からどのDLLの中を実行中かを「逆算」することが可能と言うだけ。
各DLLがロードされている場所のアドレス範囲とEIPさえあれば、そりゃ、どのDLL
にいるかは分かるけれど、それは管理とは言わないと思うな。
マシン語で、jmp アドレス、call アドレス で、1クロックですぐに EIP = アドレス
になるが、それをOSはいちいち追跡も管理も全くしていない。だから、
現在どのDLLの関数を実行中かをOSは情報としては持ってない。
ところが、EIPの値からどのDLLの中を実行中かを「逆算」することが可能と言うだけ。
654デフォルトの名無しさん
2021/07/11(日) 03:17:09.08ID:OgOa7vqd プログラミングの世界で「管理」というのは、
struct SomeInfo {
int curDllIndex; // 現在実行中のDLLのインデックス番号(0-)
};
のようなデータ構造があり、idx1 という番号の DLL の中の関数を呼び出すときに、
プログラムで curDllIndex = idx1 にちゃんと書き込む、ということをイメージする。
このような意味での書き込みは行われてない。
struct SomeInfo {
int curDllIndex; // 現在実行中のDLLのインデックス番号(0-)
};
のようなデータ構造があり、idx1 という番号の DLL の中の関数を呼び出すときに、
プログラムで curDllIndex = idx1 にちゃんと書き込む、ということをイメージする。
このような意味での書き込みは行われてない。
655デフォルトの名無しさん
2021/07/11(日) 03:24:26.40ID:OgOa7vqd OSに管理されているのであれば、idx1 番の DLLから、main モジュールの関数 f()が
コールバックされたような場合でも、どのDLLから呼び出されたかまで分かるはずだが、
現実にはEIPは、f()の中をポイントしているから EIP だけからは、idx1 を逆算する
ことは不可能。
デバッガが出来てしまうのは、デバッグしやすい様にコンパイラが
「スタックフレーム」という構造が出来るようなコードをわざと作っているから。
その構造によれば、スタックとEBPの値で呼び出しもとの関数の履歴を全て辿って
いける。
しかしこれは、OSが管理しているのではなく、デバッグ版ではそのようなコードを
コンパイラが生成しているからに過ぎない。
リリース版では効率向上のためスタックフレームが省略されることもあり、その
場合は呼び出しもとの関数が辿れなくなるので idx1 という番号を算出することは
原則的には出来なくなる。
コールバックされたような場合でも、どのDLLから呼び出されたかまで分かるはずだが、
現実にはEIPは、f()の中をポイントしているから EIP だけからは、idx1 を逆算する
ことは不可能。
デバッガが出来てしまうのは、デバッグしやすい様にコンパイラが
「スタックフレーム」という構造が出来るようなコードをわざと作っているから。
その構造によれば、スタックとEBPの値で呼び出しもとの関数の履歴を全て辿って
いける。
しかしこれは、OSが管理しているのではなく、デバッグ版ではそのようなコードを
コンパイラが生成しているからに過ぎない。
リリース版では効率向上のためスタックフレームが省略されることもあり、その
場合は呼び出しもとの関数が辿れなくなるので idx1 という番号を算出することは
原則的には出来なくなる。
656デフォルトの名無しさん
2021/07/11(日) 03:33:02.64ID:OgOa7vqd >>655
[補足]
スタックフレームは、「ユーザーランド」のアドレス空間に構成された構造で、
OSが「管理」する「システムランド」のアドレス空間にはない。
前者はプログラムに誤りが有ると壊れることがあるし、コンパイラのオプション次第
で省略されることもあるから、いつでも存在するわけでも無いし、いつでも正しい
訳でもない。
その意味で、OSの管理する構造ではない。
[補足]
スタックフレームは、「ユーザーランド」のアドレス空間に構成された構造で、
OSが「管理」する「システムランド」のアドレス空間にはない。
前者はプログラムに誤りが有ると壊れることがあるし、コンパイラのオプション次第
で省略されることもあるから、いつでも存在するわけでも無いし、いつでも正しい
訳でもない。
その意味で、OSの管理する構造ではない。
657デフォルトの名無しさん
2021/07/11(日) 03:48:47.46ID:NwP/aFzk Tool Help Library ぐらいは調べて
から書きたまえ。
から書きたまえ。
658デフォルトの名無しさん
2021/07/11(日) 07:22:23.17ID:k3ZSGeVZ659デフォルトの名無しさん
2021/07/11(日) 09:13:47.20ID:NwP/aFzk とっくに書いてるよばーか
660デフォルトの名無しさん
2021/07/11(日) 09:20:59.49ID:LL6sPKEi 「管理」の定義が独り歩きしているがもともとは>>629-632だろ?
その意味では「管理」されているでいいんじゃね?
その意味では「管理」されているでいいんじゃね?
661デフォルトの名無しさん
2021/07/11(日) 10:40:25.91ID:cuQ6hQba662デフォルトの名無しさん
2021/07/11(日) 10:42:50.54ID:cuQ6hQba663デフォルトの名無しさん
2021/07/11(日) 10:50:14.49ID:f8Vvx+nx これは話をループさせる手段なのか?w
664デフォルトの名無しさん
2021/07/11(日) 11:20:11.96ID:zTx2mwKY 「Hacking: 美しき策謀 」ぐらいは読んでこいよ
665デフォルトの名無しさん
2021/07/11(日) 11:49:37.25ID:OgOa7vqd 本当に管理されていると言うのなら、別のlibで定義されている
HMODULE get_this_dll_module();
という関数によって、あらゆるDLLのHMODULEを取得できるようになるはずで
あるが、この関数は、スタックフレームを前提にしない限りは基本的に
作ることが出来ない。なぜなら
void get_this_dll_module() {
// ここの EIP の値は、呼び出しもとの DLL のものとは違っている。
}
からである。
HMODULE get_this_dll_module();
という関数によって、あらゆるDLLのHMODULEを取得できるようになるはずで
あるが、この関数は、スタックフレームを前提にしない限りは基本的に
作ることが出来ない。なぜなら
void get_this_dll_module() {
// ここの EIP の値は、呼び出しもとの DLL のものとは違っている。
}
からである。
666デフォルトの名無しさん
2021/07/11(日) 11:51:10.61ID:OgOa7vqd667デフォルトの名無しさん
2021/07/13(火) 12:38:32.06ID:WUJYnH4r だらだらしてるので
3行でまとめてくれ
3行でまとめてくれ
668デフォルトの名無しさん
2021/07/13(火) 12:47:15.46ID:oy1AsII3669デフォルトの名無しさん
2021/07/13(火) 13:19:09.51ID:bYykchBX そういうのは動物園でやれよ
670デフォルトの名無しさん
2021/07/13(火) 13:50:43.04ID:EtxXgsUj 無駄な議論ではなく、質問者が、現在実行中の関数の所属する
DLLを正確に取得する方法があると思い込んでいた可能性があるので
大事な指摘だった可能性がある。
結論から言えば、安定してそれを取得する方法は無い。
DLLを正確に取得する方法があると思い込んでいた可能性があるので
大事な指摘だった可能性がある。
結論から言えば、安定してそれを取得する方法は無い。
671デフォルトの名無しさん
2021/07/13(火) 14:46:12.78ID:imApokgP 質問者は普通に安定した方法で自己解決していったな
672デフォルトの名無しさん
2021/07/13(火) 16:28:34.84ID:NGIJbx4Y get_this_dll_moduleてなんなんってぐぐったら
このスレが引っかかってわろた
脳内の関数だったか
このスレが引っかかってわろた
脳内の関数だったか
673デフォルトの名無しさん
2021/07/13(火) 17:47:39.31ID:QuGmZAoV 未解決のせいで盛り上がってたのかと思ったら>>622で解決してたのか
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否★4 [夜のけいちゃん★]
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★4 [蚤の市★]
- 中国側が首相答弁の撤回要求、日本側拒否★5 [夜のけいちゃん★]
- 「厚かましい挑発的発言だ」中国国連大使が高市首相発言に強く反発 日本の常任理事国入りに明確に反対 [ぐれ★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★6 [ぐれ★]
- 解体ごみ約2.3トンを山に不法投棄か トルコ国籍解体工を逮捕 埼玉 [どどん★]
- でも高市早苗がセックス外交したら逆転ホームランあるよな [695089791]
- 【悲報】高市早苗さん、たった一人で日本を崩壊へ導く [714769305]
- 【悲報】「やったー!こだわりまくった洋館仕立ての家を建てたぞ!」➡「「離婚したんで住まずに売ります……」 [158478931]
- 精神する時の🏡
- 【悲報】ファブル「━━━書かれた文面を読むだけの岸田と違って、高市は決断力や行動力があり、自分で責任を取れる。 [257926174]
- 【悲報】高市総理モノマネにとろサーモン久保田がブチギレ。「しょーもない。高市さんは頑張ろうとしてるやろ」😮 [518915984]
