yohhoyの日記

技術的メモをしていきたい日記

Windows

HRESULT型からのエラーメッセージ取得

WindowsOS環境のHRESULT型エラーコードからエラーメッセージ文字列へのお手軽変換。Microsoft Visual C++(MSVC)限定。 #include <windows.h> #include <system_error> std::string get_message(HRESULT hr) { return std::system_category().message(hr); } // GetLastError()戻り値な</system_error></windows.h>…

フライングWindows API待機関数

Windows APIのタイムアウト指定待機関数では、指定期間よりも僅かに早くタイムアウト発生する。この振る舞いは仕様通り(by design)とのこと。 WaitForSingleObject, WaitForSingleObjectEx WaitForMultipleObjects, WaitForMultipleObjectsEx MsgWaitForMult…

Win32 Debug CRT Heap Internals

Windows OS上のMicrosoft Visual C++(MSVC)ランタイムライブラリにおける、デバック動作時のヒープメモリ管理用内部データ構造情報。 Win32 Debug CRT Heap Internals

SecureStringクラスは非推奨

.NET Frameworkで提供される System.Security.SecureStringクラス は、新規コードでは利用しないこと。 .NET CoreからはSecureStringクラスは削除されている。 MonoではSecureStringクラスはデータ保護を行わない(mono-5.18.0.245現在) ImportantWe don't …

プロセス終了コードの有効範囲

プロセス終了コードの有効範囲についてメモ。 POSIX: 0〜255。整数値のうち下位8ビットのみ有効。(例: 値257は終了コード1と解釈される) Windows: 0〜4294967295。32ビット整数値。 POSIX規格(IEEE Std 1003.1-2008, 2016 Ed.)より一部引用。 If the new…

アトミックなファイル更新

POSIX環境またはWindows環境において、ファイルシステム上でアトミック(atomic; 不可分)なファイル更新を実現する方法。まとめ: POSIX:<stdio.h>標準ヘッダrename関数を利用する。 Windows:windows.hヘッダ ReplaceFile 関数が最有力候補。ただし Undocumented </stdio.h>…

Windows環境でもPythonスクリプトshebangはちゃんと書く

Pythonスクリプトのshebang(1行目の#!)*1はWindows環境でも効果がある。Windows OSにPython 3.3以降を導入すると、C:\Windowsフォルダ以下にPythonランチャpy.exeがインストールされる。Python 2/3両バージョンがインストールされている場合、同ランチャ…

.NET−Javaブリッジライブラリ

.NETクラスとJavaクラス間の相互運用を可能にするライブラリ。MITライセンス(本体)+GPLv3(ツール)。 http://jni4net.com/ https://github.com/jni4net/jni4net .NET CLRとJVMを同一プロセス内で動作させ、.NETクラスからProxyクラス経由でのJavaクラス…

synchronic同期プリミティブ

C++1z(C++17)に向けて提案されている同期プリミティブについてメモ。(PDF)N4195 std::synchronic<T> に基づく。初期提案のため概要のみ。2019-09-12追記:C++2a(C++20)に向けて提案文書 P1135R6 が採択され、atomic変数std::atomic<T>に wait / notify_one / notif</t></t>…

パスワードとmemset関数

C言語プログラム上で高機密性情報(パスワード文字列など)を消去するケースで、memset関数の単純利用では機密情報がメモリ上に残存してしまい、セキュリティ上の脆弱性につながる可能性がある。 void secure_operation() { // パスワード文字列を取得 char …

IsBadXxxxPtr系APIは使用禁止

Windows APIが提供するポインタ経由アクセス確認関数IsBadXxxxPtr系*1 は、Windows Vista以降および Windows Server 2008以降では決して利用してはならない。 安全な例外処理 以前のバージョンのWindowsでは、IsBadReadPtr および IsBadWritePtr 関数を使用…

QueryPerformanceCounter今昔

Windows API提供の高分解能パフォーマンス計測QueryPerformanceCounter関数についてメモ。 簡易的に書いておきますと WinXPではQueryPerformance系はCPUクロックを返すので上記の現象が起こる WinVista以上でHPETが有効の時はQueryPerformance系はHPETより時…

ファイルの同一性判定

POSIX環境またはWindows環境にて、2つのパス文字列が同一ファイルを指すか否かを判定する方法。(ファイルが存在していることが前提) POSIX デバイスIDとinode番号*1を用いて同一性判定を行う。 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int is_identical_file(const</unistd.h></sys/stat.h></sys/types.h>…

Boost.Thread 1.52.0 condition_variableメモリ浪費問題

Boost.Threadライブラリ 1.52.0の条件変数boost::condition_variableバグ修正(#7461)でのリグレッションにより、condition_variableオブジェクトでの反復的な待機/通知処理を行うとメモリリークが発生する。WindowsシステムかつBoost 1.52.0のみ影響を受…

文字列を含む構造体のP/Invoke

P/Invokeにおいて “メンバ変数として文字列データを含む構造体” をマネージドコード(C#)からアンマネージド(native)関数へ渡す方法メモ。注意:本記事中のC#コードでは例外安全を考慮しておらず、確保したメモリブロックのリークが発生しうる。メモ:アンマ…

P/Invokeとパラメータ方向属性

C#からのP/Invokeにおけるパラメータの方向属性*1についてメモ。C#における既定の方向属性は下表のとおり。呼び出し元/呼び出し先はマネージド(C#)/アンマネージド(native)いずれかになる。つまりexternメソッド呼び出しであればC#→nativeとなり、アンマネ…

P/Invokeの呼び出し規約+文字セット指定

C#からのP/Invokeにおける関数呼び出し規約、文字セット(MBCS/UNICODE)の指定方法についてメモ。P/Invoke既定の呼び出し規約はCallingConvention.StdCallとなっており、アンマネージド側が__stdcallならば明示指定は必須でははない。*1 P/Invoke既定の文…

Windows APIのクリティカルセクションはFIFO動作しない

Windows API提供の排他制御プリミティブCRITICAL_SECTIONでは、ロック競合スレッド間のケジューリングにおいてFIFO順序が保証されない。*1下記コードで「処理(1)が2スレッド上で交互に実行される」ことを期待した場合、Windows XP以前では予想通りの実行結果…

(無印)→Ex→ExEx

Windows APIでよく見る関数名XxxxExには、発展系XxxxExExまで到達した関数名が存在する。 EnumCalendarInfo function EnumCalendarInfoEx function EnumCalendarInfoExEx function 関連URL winapi - What does it mean when `Ex` is added to a function/met…

条件変数とダンス(Two-Step Dance)を

条件変数(condition variable)同期プリミティブに対する待機/通知で発生する現象と回避策のメモ。条件変数とミューテックスを使ったコードにおいて次のような現象が生じる。 スレッドAが条件変数cvに対して通知を行う。 条件変数cvに対してブロックされてい…

Windows XP向けの条件変数の実装方法と実例

Windows XP以前のWindows APIでは同期プリミティブとしての条件変数(condition variable)が提供されない。セマフォ(semaphore)やミューテックス(mutex)/クリティカルセクション*1を組み合わせて、条件変数プリミティブを実装するアルゴリズムおよびコード実…

条件変数とspurious wakeup

条件変数(condition variable)同期プリミティブにまつわる "spurious wakeup" についてメモ。安定した対訳語が存在しないようなので、本記事ではそのまま英語表記とする*1。spurious は “偽の; 疑似; 似非” といった意味の単語であり*2、wakeup は “条件変数…

VisualStudio11作成アプリをWinXP上で動作させるHACK

2012-11-29追記:2012年11月リリース"Visual Studio 2012 Update 1"により、Visual Studio 2012(MSVC11)でもWindows XP上で動作可能なアプリケーションを作成可能となった。 → MSDN Blog - Visual Studio 2012 の Update 1 がご利用いただけるようになりまし…

TBBとPPL/ConcRTとブロッキング操作

Intel TBB(Threading Building Blocks)およびMicrosoft PPL(Parallel Pattern Library)と、タスク内からのブロッキングAPI呼び出しに関するメモ。まとめ: TBBのスケジューラは協調的マルチタスクを行うため、タスク内から長期間ブロックする処理を呼び出す…

Windows APIコールバックでのラムダ式の利用

Visual Studio 11(MSVC11) Betaにおいて、C++11ラムダ式とWindows APIコールバック関数を組み合わせを試したのでメモ。C++11仕様“変数キャプチャを伴わないラムダ式は関数ポインタに変換可能”を利用し、コールバック関数を指定するWindows API関数へラムダ式…

windows.hのmin/maxマクロ回避策4パターン

Microsoft Windowsプラットフォームのヘッダファイル windows.h は悪名高いmin, maxマクロを定義するため、プリプロセス時に意図せずminやmaxが置換されてしまい、妙なコンパイルエラーを引き起こす場合がある。一例としてMSVC10で下記コードをコンパイルす…