保護モード+αのプロセス上で動作するCOMオブジェクトを作る
前回予告したとおり、今回は前2つの記事の合体です。アクセストークンで制限をかけたプロセス上で動作するCOMオブジェクトを作る話です。標準出力のパイプ経由でCOMインタフェースを受け渡す保護モードよりもう少しだけ制限の強いプロセスを作る「標準出力のパイプ経由でCOMインタフェースを受け渡す」で作ったクライアントプログラムc.exeはそのまま使います。オブジェクトを作る側のコードを新しく書きました。プロ...
View Article保護モード+αなプロセスをCoCreateInstanceで作る(その1)
前回(保護モード+αのプロセス上で動作するCOMオブジェクトを作る)では、CreateProcessAsUserを使いました。今回はCoCreateInstanceやCoGetClassObjectで同じように制限のあるプロセスを作る方法です。CoCreateInstanceやCoGetClassObjectでは、指定したクラスがアウトプロセスで実装されていた場合、必要に応じてプロセスが作られます。...
View Article保護モード+αなプロセスをCoCreateInstanceで作る(その2)
前回(保護モード+αなプロセスをCoCreateInstanceで作る(その1))の続きです。今回は、もう1つの方法CLSCTX_ENABLE_CLOAKINGです。これは、CoCreateInstanceやCoGetClassObjectの実引数で指定する方法です。CoInitializeSecurityと違い、都度指定できる点が便利です。ただし、Windows...
View ArticleRevertToSelfが失敗したときの処理
RevertToSelf関数が失敗を返したとき(戻り値がFALSEだったとき)、どうするかという話です。MSDNライブラリのRevertToSelfのRemarksには、さっさとプロセスを終わらせるべきと書いてあります。考えてみればたしかにそうです。たとえば、誤ってRevertToSelfが2回呼ばれるようなコードになっていたなど、回復の余地がある状況も考えられますが、そこまでがんばる必要もないでし...
View Articlestd::exceptionおよびerrnoからHRESULTに変換する
COMインタフェースをC++で実装していると、例外をcatchしてHRESULTのエラー値を返すコードを非常によく使います。毎回大雑把な実装で済ませていましたが、今回ちゃんとしたものを作ろうと思い立ちました。std::exceptionまたはその派生クラスのオブジェクトからHRESULT値を生成する関数を書きました。その過程でstd::errc...
View Article非実在ファイルのD&Dで複数ファイルを送り出す
以前の記事、非同期ドラッグ&ドロップと非実在ファイルをエクスプローラにD&Dするの続きです。CFSTR_FILECONTENTSとCFSTR_FILEDESCRIPTORによるドラッグ&ドロップ操作で、1度に複数のファイルを送り出すようにするのが今回の話です。早速サンプルコードです。Gistへのリンクです。C++ネイティブコードC++/CLI (Windows...
View Article非実在フォルダをエクスプローラにD&Dする
ファイルシステム上にないものをドラッグ&ドロップで提供する話の続きです。今回は空のフォルダを作る方法です。空のフォルダを作るには、CFSTR_FILEDESCRIPTORで渡すファイル属性としてFILE_ATTRIBUTE_DIRECTORYを指定するだけです。ファイル属性を指定する場所はFILEDESCRIPTOR構造体のdwFileAttributesです。試してみたところ、ディレクトリの場合は...
View Article管理者でも削除できないフォルダ・ファイルを作る
Windows Vistaで導入されたMandatory Integrity Control (MIC)を活用すれば、管理者ユーザーでも削除できないフォルダやファイルを作れます。実際に試してみました。 昇格した管理者ユーザーアカウントのプロセスはILが高なので、それよりさらに上のレベルであるシステムを設定してみたというだけのことです。 // il-system.cpp #define...
View ArticleBoost.Variantのpolymorphic_get関数
Boost.Variantにpolymorphic_getという関数が追加されていることに気が付きました。リリースノートを見ると1.56.0で追加されたようです(1.56.0 日本語、1.56.0 英語)。 boost::getとよく似たこの関数は、しかしboost::getと異なり、基底クラスの型を指定しても値を取り出せるというものです。 #include <iostream>...
View ArticleHRESULT_FROM_WIN32は関数である
マクロだと思っていませんか?実は、結構前からインライン関数なんです。 MSDNライブラリの該当ページのタイトルはHRESULT_FROM_WIN32 macro (COM)で、マクロのままです。しかし、その中には「こう定義されている」と、C/C++の場合はインライン関数として定義される箇所がばっちり抜粋されています。 #define __HRESULT_FROM_WIN32(x)...
View Articlenetsh traceと同じようにパケットキャプチャーするプログラムを作った
Windowsでパケットキャプチャをするなら、WiresharkとWinPcapの組み合わせが最も一般的だと思います。しかし、Windowsにもパケットキャプチャの機能が標準搭載されています。それはnetsh trace startコマンドです。 Windows 7以降のnetsh traceコマンドでパケットをキャプチャする方法 – Eiji James Yoshidaの記録...
View ArticleUCRTをアプリと同じフォルダに置く (VS2015 Update 1以降)
以前の記事、UCRTをアプリと同じフォルダに置く (VS2015 RTM)の更新版です。Visual Studio 2015 Update 1以降の変更を反映させました。 おさらい Visual C++ 2015でCRTの構成が大きく変わりました。C標準ライブラリ関数の多くがucrtbase.dll(リリースビルド), ucrtbased.dll(デバッグビルド)に移され、Windows...
View Articleデバイスインスタンスパスからネットワークインタフェースの情報を引き出す(あるいはその逆)
デバイスインスタンスパス(デバイスインスタンスID)からIPアドレスやMACアドレスなどの情報を取り出したり、あるいはその逆でデバイスインスタンスパスを得る話です。WMIを使って良ければ、Win32_NetworkAdapterのPnPDeviceIdプロパティで解決ですが、諸般の事情でこれを使いたくない場合の方法です。 Setup APIやCfgMgr...
View ArticleRegisterActiveObjectとROT
RegisterActiveObject関数は内部でRunning Object Table (ROT)を使っていると、MSDNライブラリにも書かれてあります: Registration Functions (Automation)。...
View ArticleGUIDの文字列表現の文字数のための定数
こういうコードを書いたとき、38ってWindows SDKのどこかで#defineされていないの?と疑問に思いました。 #include <iostream> #include <windows.h> int main() { // {00000000-0000-0000-0000-000000000000} GUID guid = GUID_NULL; WCHAR...
View ArticleWiresharkをWinPcap抜きで動かす
初めにお断りしておきます。タイトルは少し嘘です。正確には、WinPcapのデバイスドライバnpf.sysを使わずにWiresharkを動かします。wpcap.dllは使います。 以前書いた記事、netsh traceと同じようにパケットキャプチャーするプログラムを作ったの続きです。 今回作ったもののソースコードはegtra/ndiscap-packet (GitHub)にあります。 前回のあらすじ...
View ArticleXMLHttpRequestをVC++で使う例
ありそうで見当たらなかったので、そういうサンプルコードを書いておこうと思いました。 同期モードです。非同期モードは少しコードの分量が増えるので見送りました。 #import使っているので、Visual C++限定です。 #define UNICODE #define _UNICODE #include <iostream> #include <locale>...
View Article配列要素へのポインタと要素数からRangeを作る
boost::make_iterator_range_n関数の話です。これを最近見つけました。これは、先頭要素を指すイテレータと要素数を実引数に渡すとRangeオブジェクトを返してくれる関数です。調べてみるとBoost 1.56.0からのものでした。 C言語のAPIでよくある、配列要素へのポインタと要素数という組み合わせをRange化するのに便利です。 #include <array>...
View ArticleBoost.勉強会 #20で発表
Boost.勉強会 #20 東京でこんな発表をしました: エクストリームC++11/14プログラミング このスライドはCreative Commons — 表示 – 継承 4.0 国際 — CC BY-SA 4.0です。ダウンロードはこちらです。 エクストリームC++11/14プログラミング (PDF) エクストリームC++11/14プログラミング (PPTX)...
View Article