Проверьте на правильность
От: Tom Россия http://www.RSDN.ru
Дата: 04.09.07 14:59
Оценка:
Есть задача, получить, WIN32 структуру SID, делаем так:


            IntPtr logonToken;
            WIN32API.LogonUser(
                "t1",
                "",
                "t1",
                WIN32API.LogonType.LOGON32_LOGON_NETWORK,
                WIN32API.LogonProvider.LOGON32_PROVIDER_DEFAULT,
                out logonToken);

            WindowsIdentity loggedIdentity = new WindowsIdentity(logonToken);

            byte[] ByteSidRepresentation = new byte[loggedIdentity.User.BinaryLength];
            loggedIdentity.User.GetBinaryForm(ByteSidRepresentation, 0);


            IntPtr pSID = Marshal.UnsafeAddrOfPinnedArrayElement(
                ByteSidRepresentation,
                0);

            PtBvTasksLibrary._SID SID = (PtBvTasksLibrary._SID) Marshal.PtrToStructure(
                pSID,
                typeof(PtBvTasksLibrary._SID));


Особенно интересует валидность выделенного куска кода, ибо никакого Pinned я там не делаю и не очю понимаю что от меня хотят
Народная мудрось
всем все никому ничего(с).
Re: Проверьте на правильность
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.07 15:25
Оценка: 23 (3)
Здравствуйте, Tom, Вы писали:

Насколько я понимаю, надо так

    GCHandle h = GCHandle.Alloc(ByteSidRepresentation, GCHandleType.Pinned);
            
    IntPtr pSID = Marshal.UnsafeAddrOfPinnedArrayElement(
        ByteSidRepresentation,
        0);

        PtBvTasksLibrary._SID SID = (PtBvTasksLibrary._SID) Marshal.PtrToStructure(
        pSID,
                typeof(PtBvTasksLibrary._SID));

    h.Free();

Наличие проблемы проверяется так
        IntPtr pSID = Marshal.UnsafeAddrOfPinnedArrayElement(
                ByteSidRepresentation,
                0);

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    // тут получим мусор
        PtBvTasksLibrary._SID SID = (PtBvTasksLibrary._SID) Marshal.PtrToStructure(
                pSID,
                typeof(PtBvTasksLibrary._SID));
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Проверьте на правильность
От: nikov США http://www.linkedin.com/in/nikov
Дата: 04.09.07 16:06
Оценка: +1
Здравствуйте, adontz, Вы писали:

A>Насколько я понимаю, надо так

A>

A>    GCHandle h = GCHandle.Alloc(ByteSidRepresentation, GCHandleType.Pinned);
            
A>    IntPtr pSID = Marshal.UnsafeAddrOfPinnedArrayElement(
A>        ByteSidRepresentation,
A>        0);

A>        PtBvTasksLibrary._SID SID = (PtBvTasksLibrary._SID) Marshal.PtrToStructure(
A>        pSID,
A>                typeof(PtBvTasksLibrary._SID));

A>    h.Free();
A>


Лучше бы Free положить в finally.
Re[3]: Проверьте на правильность
От: adontz Грузия http://adontz.wordpress.com/
Дата: 04.09.07 18:43
Оценка:
Здравствуйте, nikov, Вы писали:

N>Лучше бы Free положить в finally.


Ну это да, согласен. Недочёт.
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.