きどたかのブログスマートフォン用の表示で見るきどたかのブログいつか誰かがこのブログからトラブルを解決しますように。You、DLL呼び出しちゃいなよgolang発端java.nio.file.attributeで「所有者」情報が取れる。PowerShellでも取れる。Go言語はどうだ?調査たとえば、C++でそれを行う場合、こういうことをする。(Windows)ここで登場する「GetSecurityInfo関数」はGo言語で使われているか?調べた結果、使われていない。dll呼び出しは、"src/syscall/zsyscall_windows.go"を読むと分かる。「GetSecurityInfo関数」は、「advapi32.dll」に含まれています。(Windows)Go言語は、内部で「advapi32.dll」を読み込んではいるものの、「GetSecurityInfo関数」を呼び出せるようにはなっていません。今見ているソースはGo1.8です。挑戦ネジがゆるい私は、「よし、DLL呼び出してみよう」と、泥船に足を突っ込んだ。Go内部では、ロードしているDLLですが、変数が公開されていません。しかたない、自分でロードすんぜ。modadvapi32.NewProc("GetSecurityInfo"))はい、ただのもろパクリです。あ、でもsysdll.Add()を挟むのは除外しました、なぜならばinternalはコンパイルエラーになるからです。NewLazyDLLやNewProcについては、「src/syscall/dll_windows.go」に書かれています。Procには呼び出し用のポインタレシーバが付いてます。error)とりあえず、引数を全部uintptrで渡せってことか。HANDLEhandleには、ファイルハンドルを渡すことになる。os.OpenFileして、fileからFdを得ると、それはuintptrなので、そのまま渡してみる。SE_OBJECT_TYPE今回は、SE_FILE_OBJECTを渡したいわけです。(Windows)enumで先頭が0初期化してますから、2つ目の定数SE_FILE_OBJECTは、1ってことですね。これをuintptrで渡すとか、まどろっこしいなぁ。SECURITY_INFORMATION今回はOWNER_SECURITY_INFORMATIONを渡したいので、おそらく1ですDWORDとあるので、uint32にしときます。型はPSIDこれが受け取りたい。PSIDって何?どうやら、可変長な構造であるSIDをポイントしているポインターっぽい。uintptr(unsafe.Pointer(sid))ちょっと変数名をどうするか、ちぐはぐな感じになったが、こんな感じで書いてみた。LookupSIDを参考にしている。残りの引数どうせオプションだし、渡さないことにする。ダメだった点1をあらわしている引数をuintptrにして渡してるのがどうもダメっぽかったので修正。最終的にこの形にした。