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;
}
Простая структура сейчас.