PInvoke для DWORD-выровненных дескрипторов памяти

Я пытался написать эквивалент C# для ACCESS_DENIED_ACE структура, как определено в MSDN:

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

куда SidStart является первым DWORD SID опекуна. Остальные байты SID хранятся в непрерывной памяти после члена SidStart.

Я видел примеры, когда его использовали как (PSID) &accessAllowedAce->SidStart как в,

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

Теперь, как я могу написать C# StructLayout для этого и как я могу использовать его в EqualSid также объясните, как работает ваше решение.

2 ответа

Решение

Когда я получу IntPtr за ACCESS_DENIED_ACE (предполагать deniedAceIntPtr), Я могу получить IntPtr для SID в ACCESS_DENIED_ACE, добавив смещение SidStart

IntPtr tempSid = IntPtr.Add(deniedAceIntPtr, 8);

Начните с подструктур.

[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;
}

Простая структура сейчас.

Другие вопросы по тегам