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/ 質問 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 プロパティ以外の方法でお願いします。 うちの開発環境にはないので。 プロセスのウインドウを取得して、メッセージを送るくらいしか思いつかないのですが、ウィンドウがない可能性もあるし もっとスマートな方法があればいいなと。 >>345 > ユーザーの入力に応答している をきちんと定義しないと無理でしょ ネットワークプログラミングで言う所のキープアライブ的なのを実装じゃあかんの? >>345 WM_PAINT系のメッセージを投げて クライアント領域が書き換わってるかどうかとか show/hideメッセージ送って反応するかどうか見るとか >ウィンドウがない可能性 プロセスId見て稼働率調べるかな TrayNotifyWndにアプリアイコンを追加と削除をしたいのですが、どうすればよいでしょうか? Shell_NotifyIconの登録みたいなやつです。 Shell_NotifyIconの登録と削除右派知っています。 >>353 情報ありがとうございます。やりたい内容と、ちょっと違います。 windows8.1/10とかだと、タスクバーが上か下にあるとき、タスクトレイの右側か左側にTrayNotifyWndに [IME]、[タッチパネル向けのキーボード]、[通知]などが表示されていますよね? それらの場所に、自作のアプリアイコンを作りたいのです。 スパイでみると、 通知 ハンドル 001016E キャプション 通知センター クラス TrayButton キーボード ハンドル 0010172 キャプション タッチキーボード クラス TIPBand IME ハンドル 0010156 キャプション 無し クラス Button となっています。 親ハンドルからたどってクラスを見るとTrayNotifyWndとなっています。 知りたいのは、SHAppBarMessageを使ったタスクバーみたいなウインドウではありません。 googleの画像検索で googleimeとかってやると下のような画面がでますよね? https://www.google.co.jp/search?q=googleime& ;biw=1280&bih=607&source=lnms&tbm=isch&sa=X&sqi=2&ved=0ahUKEwiZzey0zfDRAhUJbrwKHQ4dBuAQ_AUICCgD#imgrc=j130VRRhjR7jdM: TrayNotifyWndでにて、設定メニュをいじっているような画面のようなプログラムを作りたいのです。 Shell_NotifyIconで登録して、クリックされたらメニュー表示すればそれになる >>356 一般的な、Shell_NotifyIconでタスクトレイの登録ではないです。 タスクトレイの横に登録する手続きが知りたいのです。 mozcのソースコードをgrepしたところShell_NotifyIconは使われていないようです。 comクラスとかでTrayNotifyWndに追加するような機能があるのかなぁ。。 すまん。通知領域はその右側か盲目だった 直接CreateWindowでぶらさげちゃうとかできないかな IMEツールバーみたいにタスクトレイにドッキングしたいってこと? >>359 機能はIMEではないですが、そんなかんじです。 TrayNotifyWndを親にしてCreateToolbarExで作ればいいんじゃないのかな >>357 > mozcのソースコードをgrepしたところShell_NotifyIconは使われていないようです。 ならそのソースを読めばいいんじゃね? >>362 多分ソースは言語バーのcomクラス呼び出しだけで、実際の実装はWindows側 >>363 ざっくり調べたところ、おっしゃる通り言語バーのcom呼び出してるだけっぽかったです。 >>361 HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL); HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL); hButton = CreateWindowEx(0,L"button",L"@",WS_CHILD | WS_VISIBLE,0,0,48,24,hTrayNotify,0,hInst,0); 一瞬ボタンが表示されて消えましたw 登録のさせ方がたぶん違いますよね。 TBBUTTON tbButton = { 0 , 0 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 }; SendMessage(hTrayNotify, TB_ADDBUTTONS, 1, (LPARAM)&tbButton); なにも起こらず。。orz HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL); HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL); だと、タスクトレイの内部に描画されてました。 やりたいことと違う;; >>364 親側をsubclassしてボタン用のエリア常に用意してないからじゃない? >>364 TrayNotifyWndが、もしツールバーのクラスを内部で保持してたら登録できるかなーと思いついての実験でした。。 ウインドクラスTrayNotifyWndにそんな機能はなかった。うまくいかないものですね。 HWND hTaskBar = ::FindWindow(L"Shell_TrayWnd", NULL); HWND hTrayNotify = ::FindWindowEx(hTaskBar, NULL, L"TrayNotifyWnd", NULL); HWND hToolbarWindow32 = FindWindowEx(hTrayNotify, NULL, L"ToolbarWindow32", NULL); printf("handle %p %p %p ", hTaskBar, hTrayNotify, hToolbarWindow32); SendMessage(hToolbarWindow32, TB_ADDBUTTONS, 1, (LPARAM)&tbButton); 実験してだめだったコード。。こんな感じでした。ウインドハンドルは普通に取得は成功していたみたいなんですけどね〜 指定したソフトが生きてるかフリーズしてるかを判断できるAPI教えてくださいよ >>371 その画像だと、ウインドウが、タスクトレイの位置にありませんか? タスクトレイの内部にアプリアイコンを作るのであれば、Shell_NotifyIconで登録すればいいだけです。 やりたいのは、その画像でいうと、時計の右横の通知領域の右にウインド領域を追加したいのです。 >>370 それだと帰ってこなかったら出した側も固まりませんか? >>373 別スレッドからメッセージ投げて、メインでスレッド監視して待機時間オーバーしたかどうかで判定するとか >>374 なるほど。 メッセージ投げてから返答が帰るまでの待ち時間で判断するって事ですね。 ありがとうございます。さっそくやってみます。 >>372 タスクトレイの左側にある隠れたアイコンを表示するための ^ ボタンの上に作ったボタンが表示されてる ウインドウ表示位置だけの問題で期待してる通りだと思うよ http://i.imgur.com/dyVnefi.png >>373 無限ループで処理してるかもしれないから、生き死にの定義による >>376 今ターゲットソフトをwhile(1)で固めて 監視ソフトでPostMessageやGetWindowRectをしたら正常に帰ってきました。 while(1)だとウィンドウの移動もできたのでこれは死亡にはならないですね >>377 そんなのあったのですね、ありがとうございます試してみます >>378 PostMessageは相手の処理を待たないから当然。 GetWindowRectも相手のプロセスが情報を返すわけじゃないから当然。 その方法を試すならSendMessage。 >while(1)だとウィンドウの移動もできたので コンパイラの最適化によって(無意味な)無限ループが消されているかも。 >>379 失礼、PostMessageじゃなくてSendMessageでした。 while(1)はウィンドウは動かせますがフォーム自体は固まった状態でした(マウスカーソルがくるくるになります) IsHungAppWindowで指定間隔で数回みて連続でTRUEなら落ちてると判断できそうな感じでした しかしwhile(1)ではなく実際にどこかのDLL関数内で落ちてる場合とかにFindWindowでハンドルは取れるのでしょうか? >>380 こんな関数あったんですね・・・ これは良い情報を頂きましたありがとうございます メッセージ投げといてタイムアウトしたらあとは知らないって まるで鍵垢へのフォロリクか2ちゃんの独り言のようだ ピンポーン 宅配便でーす お留守ですかー ピンポーン ピンポーン 帰りに台車を放り投げて荷物を蹴とばすんですね判ります GetWindowRectで得た値から計算して MoveWindowに使うとズレるんですがこれは仕様なんですか? 例えばGetWindowRectで left=100 right=200 top=100 bottom=200 だったとして、これだと幅と高さが 101になるので MoveWindow(hwnd,100,100,101,101,TRUE) としたら幅と高さが1ドットずつ膨らんでしまいます WindowsAPIのRect系は右と下の1ドットは含まれないはずだったが ピクセルの左上の隙間の位置を返す仕様(Javaと同じ) なので単純に差を出して指定しないと膨らむ >>387 画面DPI100%以外になってない?vista以降はそれ原因で従来のAPIの扱いが面倒になってる ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる