Win32API質問箱 Build123©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
Win32APIについての質問はこちらへどうぞ。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで ■過去スレ Win32API質問箱 Build122 http://echo.2ch.net/test/read.cgi/tech/1451988219/ 本件、私としては以下の結論に至りました。 ○timeGetTime()は信頼できる。 ○GetThreadTime()は信用できない (ティック間切り上げ的な傾向あり。理由不明。)。 ○timeGetTime()を基準に>>212 のような方法をとるほかない。 もう一度GetThreadTime()はどうしても信用ならず、 他に有用な代替手段もないため、 >>212 の方法が限界である旨を報告することにします。 何人かの真剣に助言して下さった方々、 本当にありがとうございました。 >>228 ドラスレの木屋さんも、timeGetTimeのこと調べてたな timeGetTimeやめてQueryPerformanceCounterを使ったら? あらかじめtimeBeginPeriodも呼んでおかないと精度変わる 静的領域に書き込みすると、コピーオンライトが発生し、 動的領域を確保すると、最初とおよび足りない時はOSで確保と初期化があると思う それが1回目が遅い理由な気がする 質問者はアレだが それはそうと、どうでも良いことをいうのはやめたほうが良いだろう 実時間とスレッド時間が食い違うって話だから 1回目が遅いとかそういう話ではない 質問者のアプローチや解釈が正しいのかが分からないのに、憶測で質問者回答者とも上から目線で やりあってる状況にまず疑問を抱いた方がいい。 そしてそれら以下の書き込みしかできないID:EDk65fqOはクソ中のクソだと認識した方がいい。 最初からGetThreadTimesは約1/64秒の精度しか無いって分かっていたはずなのにね。 平均とっても意味がないってことが改めて分かったことだけが成果か。 >>247 とか>>249 とか、全然関係ないことじゃん。 OSがどうやってカーネルモードやユーザーモードの時間を計測しているのか想像できないのかねえ オーバーヘッドが高いやり方は採用できないと分かりそうなもんだが 触発されてGetThreadTimes=NtQueryInformationThread調べたんだけど”スレッド”の中身が興味深かった 質問者糞だから詳細は書かないがw 俺もほんとはGetThreadTimesの特性知ってるけど、 質問者が土下座しないと教えてやらねぇw Windows10ってCOMポート番号は最大何番までなんでしょうか? 昔、レジストリから認識してるポート名を取得するサンプルあったな。 MSDNだったかな WM_CHARでWPARAMに入ってくるコード一覧どっかない? 普通のキーならそのままだが、Back SpaceとかCtrl+Vとかのコードが知りたい。 >>266 キーが押されてるかどうかの確認は、WM_KEYDOWNを使う。 「仮想キーコード一覧」で検索。 ただし、Ctrl,Shift,Altはmodifiersと呼ばれ、特別扱い。CtrlとShiftは GetKeyState(VK_SHIFT) < 0 GetKeyState(VK_CONTROL) < 0 で確認でき、AltはWM_NCKEYDOWNで確認できる。 訂正。 × AltはWM_NCKEYDOWNで確認できる。 ○ AltはWM_SYSKEYDOWNで確認できる。 プログラム実行中のログテキストをエディットコントロールに出力しようと思ったのですが、 32KB制限があり実用できないことが分かりました。 リッチエディットではそのような制限はないようなので、 特に問題なければこれでいこうかと考えているのですが、 他に良い方法があればご教示ください。 >>270 ありがとうございます。 今回は検索機能とかも付けたいので、エディット系コントロールを利用することにします。 >>271 ありがとうございます。 これで通常のエディットコントロールで32KB以上を扱えます。 助かりました! >>273 リッチエディットで実装を進めていて、あとは検索機能だけ、というところまで作れたんですが、 まさかリッチエディット自体に検索機能があったとは・・・! ここでお聞きしてよかったです。 ありがとうございました! paint.netのツールウィンドウみたいなやつってどうやって表示するの? ウィンドウスタイルを色々試してみたけどあれと同じようなウィンドウが出ない。 >>276 ありがとう。 拡張スタイル使ってもやっぱり無理だ。 思い通りに動かない。 数年前からずっと謎なんだよなこれ。 動作上問題が少ないから我慢してたんだけども。 それっぽいウインドウは出るものの、paint.netのように全ウインドウがアクティブ状態にならない。 【参考画像】http://news.softpedia.com/images/extra/WINDOWS3/large/paint.net/paint.net%20interface.jpg paint.netを実際に使ってるとよく分かるんだが、 参考画像のようにメインのウインドウもツール用のウインドウも常にアクティブな状態が維持される。 しかし、拡張スタイルでWS_EX_TOOLWINDOWを指定してもアクティブなウインドウは常に1つ。 メインのウインドウをクリックすればツール用ウインドウは非アクティブになり、 ツール用ウインドウをクリックすればメインウインドウは非アクティブになる。 非常に気持ちが悪い。 確かにWS_EX_TOOLWINDOWを利用すればメインウインドウより常に前面になり、 タスクバーにも表示されず、非常にpaint.netのツールウインドウと似たような挙動になるが、 このアクティブ/非アクティブに関しては挙動が全く違う。 ちなみにアクティブ/非アクティブの判断はタイトルバーの色で判断している。 さらに参考画像のツールウインドウのような右上の正方形の閉じるボタンの表示のさせかたも分からない。 ・・・と思ったら出てきたわ。 http://www.catch22.net/tuts/docking-toolbars-part-1 やっと出てきた。 WS_EX_TOOLWINDOWで検索してもノイズが多くてなかなか出てこなかった。 (ノイズ = MSDNのウインドウスタイルの一覧をコピペしただけのゴミサイト) ノイズゴミサイトマジで迷惑。 嫌がらせでしかない。 結局今回のカギはGoogle画像検索。 ふと「サンプル載せてるサイトの半数くらいはスクショも載せてるのではないか」と思い、 例の拡張スタイルで画像検索。 俺がやりたいのと同じ状況になってる画像を見つけて開いたらビンゴ。 画像検索なんて今まで思いもよらなかったよ。 文字検索するとノイズゴミサイトばかり出てきてどうにもならなかった。 MSDNのコピペサイト作ってるゴミ共は早く死ねばいいのにな。 役に立たないどころか大迷惑。 最近流行りの質の低いキュレーションサイト()と同レベル。 google personal blocklistでかたっぱしからブロックしてる xxxユーザー会もノイズ源だね 顔写真ブロックは必須 おまえらキモ面なのに何故あんな目立つ場所に配置すんだ >>277 そういうときはいっそそのソフト解析したら? Paint.NETなら簡単に逆コンパイルできるし、Spy++とか使うだけでもある程度わかる アフィだったのかよ。新手すぎてアフィの影すら俺には見えん 質問 writefile関数を使用してint型で、データ保存ができません。同じ悩み持ったことある人いらっしゃいませんか。 int Data = 123456;; DWORD writeLen; WriteFile(hFile,&Data,sizeof(Data),&writeLen,NULL); こういうことだろ? 変数のアドレスをwritefileにわたさないとだめ。数値そのままわたしてるんでしょ >>292 >>293 ありがとうございます。引数としてアドレスを渡さないといけないのですね。試してみます! どうしてこういう訳そのままずっと放置してんだろうな > 関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。 > If the function fails, the return value is zero. To get extended error information, call GetLastError. >>296 なんで付けるの? 誤訳トラップにハマりたいの? 俺は誤訳トラップどころか英語版と日本語版で引数違うトラップにハマったことがあるけども。 日本語版を穴が空くほど見て確認したけど何日経ってもコンパイルが通らず、 何の気なしに英語版開いたら引数の数が違って、 英語版見ながら修正したら一発でコンパイル通ったわ。 >>298 今時どんな開発環境使ってるんだよ w VisualStudio なら関数名 + '(' を入力した時点でプロトタイプが表示されるだろ >>299 ごめんなさいwww >>300 その当時はVector辺りで見つけてきた適当なテキストエディタとBCCだったよ。 レポートタイプのリストビューをクリックしたら、その行のデータに対応する内容を 別の窓に詳細表示するというような動作をしているのですが、クリック時は NM_CLICK を処理してクリックされた行を nmLv->iItem メンバを参照して知ることができます。 オペレーションとしてはマウスだけではなくキーボード操作でリストビューの選択行を 次々と移動させることも多いので、LVN_KEYDOWN も処理して上記と同様の動作を させたいのですが、LVN_KEYDOWN 処理時は nmLv->iItem の中身が不定です。 LVN_KEYDOWN 処理時に ListView_GetNextItem で LVNI_ALL | LVNI_SELECTED を 指定して選択行を調べると、キーボードを押して選択行を変更する前の選択行が 得られてしまいます。 この辺は、一旦メッセージループを回すなどしてから現在の選択行を得ること自体は 可能と言えば可能なのですが、ここまでしないとダメなのかという疑問があります。 LVN_KEYDOWN 処理時、もしくはキーボード操作で選択行を変更した際、簡潔に 現在の選択行を得る方法はありますでしょうか? 質問です。 win10 x64 windows がキャッシュしてる dns の名前解決結果の一部を書き換えることは可能ですか? または、名前解決の最中に結果をいじるようなフックは出来ませんか? 例えば、example.com の ttl を長めに書き換える、とかです。 よろしくお願いします。 >>305 デバッグ特権があれば、別のプロセスのプロセスメモリーにアクセスすることも可能。 対象アプリ限られてくるけどAPIフックすりゃ簡単に結果改竄はできるな キャッシュ改竄はフィルタードライバあてる面倒なのしか思いつかない 以下の処理を実装したく、助言をお願いします。 ダブルクリックや右クリ開くなどで、ファイルを開く際に 関連付けの有無に関わらず、そのファイルのパスを取得したい。 ShellProcあたりのフックかと考えましたが、パスをどうやって 調べるのか分かりません。 どうぞ宜しくお願いします。 目的次第だがShellProcは違うんじゃないか explorer.exeに対してShellExecuteあたりのフックか? >>305 , 306 レスありがとうございます。 DLL注入やアタッチのよるDNS改ざんは確かにできそうですね。 検討してみます。 ちなみに、プロセスは基本的には chrome です。 >>307 できればフィルタードライバの設計を、おおざっぱでもいいので教えて頂けませんか? (ドライバのコーディングは、ほぼ経験が無く、ネットワークそのものの知識はあるものの、windows内部での扱いやAPIはまったく知識が無いです) ちなみに、VPNによる仮想アダプタと、複数のネットワークカード(アダプタ)があるのですが、それでも対応可能でしょうか? (直感的には、特定アダプタに対するフィルターだと、アダプタの優先度に左右されそう。アダプタ依存にはしたくないです) >>304 解決しました。 どうもありがとうございました。 >>311 WDKサンプルのこのあたりが参考になるのかな NDIS 6.0 Filter Driver Windows Filtering Platform Packet Modification Sample >>313 ありがとうございます。参考にさせて頂きます。 >>314 きっとおまえがやりたいことはchrome拡張でonbeforerequestいじれば解決する・・・ iniファイルから文字列を読み込むGetPrivateProfileString()なんですが、 セミコロン以下のコメント文まで読み込んでしまいます。 コメント文は読み込まないようにできないでしょうか? それとも自分でコメント文を削除するしかないでしょうか? セミコロン付けたらコメントになるって言うけどよー あれ実際は特別扱いなんかしてなくて、例えば ;abc=def にしたら「;abc」って名前になるから「abc」に一致しなくなるだけじゃないかと疑ってる セミコロンは行頭にある時だけを特別扱いしているみたいだ 使ってるエディタが.iniの同一行コメントもコメント色に変換してくれるので、誤解してしまいました。 気を付けます。 winsockの関数フックしたいんですけどインポートアドレステーブル上の ws2_32.dllの関数だけ取得できません。どうしたら? ttp://up2.cache.kouploader.jp/koups19399.txt このコードは 自身のロードしたDLLの関数名を列挙するだけのシンプルなものですが、 やはりwinsockの関数名だけ取得できないです。 ImageDirectoryEntryToData()の第3引数を IMAGE_DIRECTORY_ENTRY_IATや IMAGE_DIRECTORY_ENTRY_DELAY_IMPORTに変えても取得できませんでした(そもそも関数がnull返してくる >>325 成功しているようです >>326 関数名が名無しということですか? >>327 どのタイミングでですか? if(IMAGE_SNAP_BY_ORDINAL(pThunkData->u1.Ordinal)) winsockの関数だけこのif文が真になります。 ttp://i.imgur.com/jWNmlgm.png デバッガでIAT覗くと、正しい関数名ではないが、2つの関数らしきもの?が表示されていて これがWSAStartup()/WSACleanup()に対応するものだと思われます 他のDLLでは関数名が正しく表示されます。 これが、関数名が名無しということならどう対処するのかご教示頂きたいです。 海外のフォーラムの似たような質問では ImageDirectoryEntryToData()の第3引数を IMAGE_DIRECTORY_ENTRY_DELAY_IMPORTに変えて成功したと書かれていたんですけどね、成功しませんでした。 >>328 関数名は名前あるけど、インポートが名無し >>331 ヒントありがとうございました。解決しました PIMAGE_THUNK_DATA pThunkData = (PIMAGE_THUNK_DATA)((PBYTE)hmodCaller + pImportDesc->OriginalFirstThunk); PIMAGE_THUNK_DATA pRealThunk = (PIMAGE_THUNK_DATA)((PBYTE)hmodCaller + pImportDesc->FirstThunk); while(pThunkData->u1.Function){ FARPROC pfnImportedFunc = (FARPROC)(pRealThunk->u1.Function); ・・・ 上記のIAT上の関数アドレスと、 LoadLibrary()&GetProcAddress()で取得したwinsock関数のアドレス を比較し一致したものを書き換えたら成功しました。 ttp://blog.techlab-xe.net/wp-content/uploads/2014/05/pe-format-import-func-list.png これそもそも 文字列比較より アドレス比較を用いる方法のほうが正確なやりかたですよね? CreateProcess関数の質問です。この関数で開いた外部プロセスを、操作しようとしたらハンドルされていない例外エラー発生したことある人いますか? エラーメッセの オブジェクト参照がオブジェクトインスタンスに設定されていませんの意味もいまいちわからずです。悩んでいます。 どなたかヒントをくれたら幸いですm(__)m たぶんCreateProcessの問題じゃなくてソースコードの問題 基本的なとこをどっか間違えてると思う >>333 まずは使ってるプログラム言語から書こうか >>335 >>336 HWND hwnd; STARTUPINFO si; BOOL boRet = 0; DWORD dwRet = 0; ZeroMemory(&si, sizeof(si)); ZeroMemory(&piMplab, sizeof(piMplab)); si.cb=sizeof(si); GetStartupInfo(&si); boRet = CreateProcess(_T(""C:\Program Files (x86)\Microchip\PICkit 3 v3\"Pickit3.exe"),NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&piMplab); CloseHandle(piMplab.hThread); CloseHandle(piMplab.hProcess); すみませんこんな感じですm(__)m↑ >>337 それ以外の部分、もしくは書くために変えた部分に問題があると思う >>337 まずは CreatepProcess の戻り値とエラーなら GetLastError の値を確認しようか \はここに貼り付けたから崩れたのか 元のソースが1個なのか >>333 なんか.NETのエラーメッセージっぽいけど、.NETから呼び出しているの? 該当部分のソースを全部貼り付けなきゃ誰もわからないでしょ。 そもそもどっちのプロセスがエラーを出してるかすら把握できてなさそう 子プロセス呼び出しはなんとなくコピペで扱うには荷が重い プロセスを起動して、ユーザーの入力に応答しているか確認するにはどうしたらいいでしょうか。 Process::Responding プロパティ以外の方法でお願いします。 うちの開発環境にはないので。 プロセスのウインドウを取得して、メッセージを送るくらいしか思いつかないのですが、ウィンドウがない可能性もあるし もっとスマートな方法があればいいなと。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる