GetFileSecurityのlpnLengthNeeded戻り値変わったのでしょうか

解決


Kuni  2004-09-03 13:35:07  No: 54383

開発環境はVCでは無いのですが、WATCOM−C++とSDKを利用してプログラム作りをしています。
---
さて、GetFileSecurityを利用してセキュリティ情報を取得しようとして解らない事が有りましたのでご存じの方いらっしゃいましたらご教授下さい。
---
MS社のサイトの説明によると
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpsecupf/html/_win32_GetFileSecurity.asp
lpnLengthNeededの戻り値は、
  ・成功した場合は0
  ・バッファサイズが不足している場合は、バッファのサイズ
となっています。
確かにWindowsNT4.0ではそのように動いているのですが、2000/XPでは成功した場合でも、バッファに格納したサイズとなっているようです。
この関数は、Windows2000以降で仕様変更が有ったのでしょうか、それとも私の勘違いなのでしょうか?
よろしくお願いします。


九条  2004-09-03 20:26:27  No: 54384

上記リンクには
> 関数が成功すると、0 以外の値が返ります。
> 関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、
> GetLastError 関数を使います。

となっています。またわたしの手元のMSDNでも同様です。
手元にWindowsNT4.0がないので確認のしようはないのですが、
一応ご報告まで。


Kuni  2004-09-03 22:26:31  No: 54385

九条様有り難う御座います。
関数自体の戻り値はそうなのですが、ここでのお問い合わせ内容は、lpnLengthNeeded(最後の引数)へ戻される内容です。
---
記載したhpでは、
lpnLengthNeededは、ファイル記述子のコピーに成功した場合、この関数はこの変数を 0 に設定します。バッファが小さすぎてセキュリティ記述子を収容できない場合、この変数は必要なバイト数を受け取ります。
と記載されています。
---
しかし、私のテストした環境では、
  WinNT成功すると0が戻されます。
  Win2K/XP成功しても0ではなく、必用なパイと数と思われる数値が設定して戻されています。
---
よろしくお願いします。


YuO  2004-09-03 23:13:02  No: 54386

ちゃんと原典にあたりましょう。
http://msdn.microsoft.com/library/en-us/secauthz/security/getfilesecurity.asp
0が返る,というのが説明と間違っているような気もします。

まぁ,正しい結果かどうかは関数の戻り値を使い,実際の長さはGetSecurityDescriptorLength
http://msdn.microsoft.com/library/en-us/secauthz/security/getsecuritydescriptorlength.asp
で取得する,というのが安全なのでは?


三毛猫  2004-09-03 23:33:08  No: 54387

VisualStudio6.0付属のMSDN Libraryだと
| lpnLengthNeeded
| Points to a variable the function sets to zero
| if the file descriptor is copied successfully.
となっていますね。

VisualStudio.NET2003付属のMSDN Libraryでは
YuOさんが示されたものと同じ内容になっていますから、
仕様が変わったのではないでしょうか。


Kuni  2004-09-04 07:08:46  No: 54388

関数仕様が変わったようですね。
OSにより異なる挙動を示したので不思議に思い質問させて頂きました。
どうも有り難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加