30 March, 2010

Своя личная NTLM authentication в remoting (Часть №1)

Задача поставлена, теперь как бы ее так реализовать с использованием того-же NegotiateStream но уже поверх remoting. Сперва наперво должно прийти понимание, что наш NegotiateStream будет работать только с некоторыми стримами: NetworkStream или PipeStream. FileStream, MemoryStream не годятся категорически. Можно еще нагородить что-то свое, но это довольно долго. Сперва напишем интерфейс общения клиента и сервера.

Вольности в метаданных

Ну как всегда, напишешь что-нибудь хорошее, а на каких-то исходных данных оно не работает. Вот и с метаданными произошла такая засада: некоторые .NET компиляторы именуют главный metadata stream не #~ как все белые люди, а так сказать упрощенно, для бедных: #-

08 March, 2010

NTLM Authentication просто и со вкусом

Я довольно долго искал простой и стандартный путь для того чтобы произвести аутентификацию пользователя (текущий пользователь - вы не знаете его пароля и пользователь заданный при помощи NetworkCredential) на удаленном компьютере. Хотел уже было все написать ручками через AcquireCredentialsHandle/InitializeSecurityContext/AcceptSecurityContext/CompleteAuthToken, но совсем неожиданно нашел NegotiateStream - который и занимается данным непростым процессом. По сему поводу написал маленький примерчик (пример работает только в пределах одного компьютера, если хотите большего, то замените NamedPipeXxxStream на Socket).

03 March, 2010

Object synchronization method was called from an unsynchronized block of code

Симптомы: Посредством remoting вы создаете Mutex на удаленной машине все работает хорошо, но в один прекрасный момент при попытке вызвать ReleaseMutex вы получаете exception "Object synchronization method was called from an unsynchronized block of code". Ошибка плавающая, возникает время от времени и не на всех компьютерах.

Диагноз: ReleaseMutex вызывается не из того же thread что и вызов WaitOne так как никто не гарантирует, что отдельные remoting вызовы будут работать в том же thread.

Лечение: Можно нагородить на удаленной машине объект, который будет обеспечивать тот же тред для вызывов WaitOne и ReleaseMutex. А можно просто заменить Mutex на Semaphore...

15 February, 2010

Выравнивание в CLR и в C/C++

Столкнулся вот с проблемой: нужно было установить однозначное соответствие структуры в C/C++ и в CLR, структурка небольшая вот такого вида:
#pragma pack(push, PPP)
struct XXX
{
    LPVOID m_AAA;
    ULONG m_BBB;
    ULONG m_CCC;
    ULONG m_DDD;
};
#pragma pack(pop)

31 January, 2010

Бережливой хозяйке на заметку

Все знают функцию QueryPerformanceCounter, но как давеча выяснилось не все знают, что ее реализация под Windows Vista x64 портит регистр xmm0 после своего вызова. Windows7 x64 такой пакости не делает.

27 January, 2010

Нестыковочки

Неожиданно на одном компьютере dotTrace 4.0 начал валиться при профиляции безобидного приложения. Выяснилось, что виноват во всем класс System.Reflection.Emit.DynamicMethod. Оказывается при обработке исключений он сильно влияет на парность ExceptionSearchFunctionLeave и ExceptionUnwindFunctionLeave - вызовы ExceptionSearchFunctionEnter и ExceptionUnwindFunctionEnter напрочь отсутствуют. Профайлер не ожидавший такой подставы валится (в релизной сборке убрано большинство проверок для увеличения производительности). Сейчас все починено и работает...

P.S. Подробности по этой проблеме тут в разделе DynamicMethods.

Новое в dotTrace 4.0

Появилась поддержка Silverlight 4.0, пока не сделан отдельный тип аргумента, но я уже думаю об этом. Технически вся поддержка свелась к правильной установке CORECLR_ENABLE_PROFILING и CORECLR_PROFILER, прошу не путать с COR_ENABLE_PROFILING и COR_PROFILER.