Windows
Windows OSのエラーコードに関するMicrosoft公式仕様書。HRESULT値/Win32エラーコード/NTSTATUS値を広範にカバーしている。 [MS-ERREF]: Windows Error Codes 関連URL HRESULT型からのエラーメッセージ取得 - yohhoyの日記
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のタイムアウト指定待機関数では、指定期間よりも僅かに早くタイムアウト発生する。この振る舞いは仕様通り(by design)とのこと。 WaitForSingleObject, WaitForSingleObjectEx WaitForMultipleObjects, WaitForMultipleObjectsEx MsgWaitForMult…
Windows OS上のMicrosoft Visual C++(MSVC)ランタイムライブラリにおける、デバック動作時のヒープメモリ管理用内部データ構造情報。 Win32 Debug CRT Heap Internals
.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>…
Pythonスクリプトのshebang(1行目の#!)*1はWindows環境でも効果がある。Windows OSにPython 3.3以降を導入すると、C:\Windowsフォルダ以下にPythonランチャpy.exeがインストールされる。Python 2/3両バージョンがインストールされている場合、同ランチャ…
.NETクラスとJavaクラス間の相互運用を可能にするライブラリ。MITライセンス(本体)+GPLv3(ツール)。 http://jni4net.com/ https://github.com/jni4net/jni4net .NET CLRとJVMを同一プロセス内で動作させ、.NETクラスからProxyクラス経由でのJavaクラス…
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>…
C言語プログラム上で高機密性情報(パスワード文字列など)を消去するケースで、memset関数の単純利用では機密情報がメモリ上に残存してしまい、セキュリティ上の脆弱性につながる可能性がある。 void secure_operation() { // パスワード文字列を取得 char …
Windows APIが提供するポインタ経由アクセス確認関数IsBadXxxxPtr系*1 は、Windows Vista以降および Windows Server 2008以降では決して利用してはならない。 安全な例外処理 以前のバージョンのWindowsでは、IsBadReadPtr および IsBadWritePtr 関数を使用…
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の条件変数boost::condition_variableバグ修正(#7461)でのリグレッションにより、condition_variableオブジェクトでの反復的な待機/通知処理を行うとメモリリークが発生する。WindowsシステムかつBoost 1.52.0のみ影響を受…
P/Invokeにおいて “メンバ変数として文字列データを含む構造体” をマネージドコード(C#)からアンマネージド(native)関数へ渡す方法メモ。注意:本記事中のC#コードでは例外安全を考慮しておらず、確保したメモリブロックのリークが発生しうる。メモ:アンマ…
C#からのP/Invokeにおけるパラメータの方向属性*1についてメモ。C#における既定の方向属性は下表のとおり。呼び出し元/呼び出し先はマネージド(C#)/アンマネージド(native)いずれかになる。つまりexternメソッド呼び出しであればC#→nativeとなり、アンマネ…
C#からのP/Invokeにおける関数呼び出し規約、文字セット(MBCS/UNICODE)の指定方法についてメモ。P/Invoke既定の呼び出し規約はCallingConvention.StdCallとなっており、アンマネージド側が__stdcallならば明示指定は必須でははない。*1 P/Invoke既定の文…
Windows API提供の排他制御プリミティブCRITICAL_SECTIONでは、ロック競合スレッド間のケジューリングにおいてFIFO順序が保証されない。*1下記コードで「処理(1)が2スレッド上で交互に実行される」ことを期待した場合、Windows XP以前では予想通りの実行結果…
Windows APIでよく見る関数名XxxxExには、発展系XxxxExExまで到達した関数名が存在する。 EnumCalendarInfo function EnumCalendarInfoEx function EnumCalendarInfoExEx function 関連URL winapi - What does it mean when `Ex` is added to a function/met…
条件変数(condition variable)同期プリミティブに対する待機/通知で発生する現象と回避策のメモ。条件変数とミューテックスを使ったコードにおいて次のような現象が生じる。 スレッドAが条件変数cvに対して通知を行う。 条件変数cvに対してブロックされてい…
Windows XP以前のWindows APIでは同期プリミティブとしての条件変数(condition variable)が提供されない。セマフォ(semaphore)やミューテックス(mutex)/クリティカルセクション*1を組み合わせて、条件変数プリミティブを実装するアルゴリズムおよびコード実…
条件変数(condition variable)同期プリミティブにまつわる "spurious wakeup" についてメモ。安定した対訳語が存在しないようなので、本記事ではそのまま英語表記とする*1。spurious は “偽の; 疑似; 似非” といった意味の単語であり*2、wakeup は “条件変数…
2012-11-29追記:2012年11月リリース"Visual Studio 2012 Update 1"により、Visual Studio 2012(MSVC11)でもWindows XP上で動作可能なアプリケーションを作成可能となった。 → MSDN Blog - Visual Studio 2012 の Update 1 がご利用いただけるようになりまし…
Intel TBB(Threading Building Blocks)およびMicrosoft PPL(Parallel Pattern Library)と、タスク内からのブロッキングAPI呼び出しに関するメモ。まとめ: TBBのスケジューラは協調的マルチタスクを行うため、タスク内から長期間ブロックする処理を呼び出す…
Visual Studio 11(MSVC11) Betaにおいて、C++11ラムダ式とWindows APIコールバック関数を組み合わせを試したのでメモ。C++11仕様“変数キャプチャを伴わないラムダ式は関数ポインタに変換可能”を利用し、コールバック関数を指定するWindows API関数へラムダ式…
Microsoft Windowsプラットフォームのヘッダファイル windows.h は悪名高いmin, maxマクロを定義するため、プリプロセス時に意図せずminやmaxが置換されてしまい、妙なコンパイルエラーを引き起こす場合がある。一例としてMSVC10で下記コードをコンパイルす…