0

MSDNACCESS_DENIED_ACEで定義されているように、構造体に相当する C# を作成しようとしていました。

typedef struct _ACCESS_DENIED_ACE {
  ACE_HEADER  Header;
  ACCESS_MASK Mask;
  DWORD       SidStart;
} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;

SidStartトラスティの SID の最初の DWORD はどこにありますか。SID の残りのバイトは、SidStart メンバーの後の連続したメモリに格納されます。

のように使用される例を見てき(PSID) &accessAllowedAce->SidStart ましたが、

if ( EqualSid (pSid, (PSID) &accessDeniedAce->SidStart) )
{
   //
}

これでC#StructLayoutをどのように記述し、関数でどのように使用できるEqualSidか、またソリューションがどのように機能するかを説明してください。

4

2 に答える 2

2

サブ構造体から始めます。

[StructLayout(LayoutKind.Sequential)]
struct ACE_HEADER
{
    byte AceType;
    byte AceFlags;
    uint AceSize;
}

DWORD = uint

[Flags]
enum ACCESS_MASK : uint
{
    // ...
}

32ビットとして表されるフラグベースの列挙型構造体です(つまり、複数の状態を切り替えることができます)。文書化されているようにビットを定義する必要があります。

[StructLayout(LayoutKind.Sequential)]
struct ACCESS_DENIED_ACE
{
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    uint SidStart;
}

今はシンプルな構造。

于 2012-07-25T10:51:45.933 に答える
1

IntPtrfor ACCESS_DENIED_ACE(assume ) を取得すると、 IntPtr tempSid = IntPtr.Add(deniedAceIntPtr, 8);deniedAceIntPtrのオフセットを追加することで、ACCESS_DENIED_ACE で SID の IntPtr を取得できます。SidStart

于 2012-07-26T07:27:52.950 に答える