Курсовая работа: Профилировщик приложений
FILE_DEVICE_SPECTATOR,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&pDeviceObject);
Для созданного обекта устройства регистрируется символьная ссылка SYMBOLIC_LINK:
#define SYMBOLIC_LINK L"\\DosDevices\\Spectator"
RtlInitUnicodeString( &symbolicLink, SYMBOLIC_LINK );
status = IoCreateSymbolicLink( &symbolicLink, &deviceName);
Создаётся объект ядра мьютекс:
NTSTATUS CreateMutex()
{BEGIN_FUNC( CreateMutex );
NTSTATUS status = STATUS_SUCCESS;
status = _ExAllocatePool( g_pMutex, NonPagedPool, sizeof( KMUTEX ) );
if ( NT_SUCCESS( status ) )
{KeInitializeMutex( g_pMutex, 0 );
status = STATUS_SUCCESS;}
END_FUNC( CreateMutex );
return ( status );}
Впервые загружается информация о процессах и их потоках:
if ( LockInfo() == STATUS_SUCCESS )
{ReloadInfo();
UnlockInfo();}
Функции LockInfo() и UnlockInfo() являются просто напросто функциями-обёртками для функций LockMutex() и UnlockMutex() соответственно. Первая из последних двух функций ожидает на объекте ядра мьютекс.
Объекты ядра «мьютексы» гарантируют потокам взаимоисключающий доступ к един ственному ресурсу. Отсюда и произошло название этих объектов (mutual exclusion, mutex). Они содержат счетчик числа пользователей, счетчик рекурсии и переменную, в которой запоминается идентификатор потока. Мьютексы ведут себя точно так же, как и критические секции. Однако, если последние являются объектами пользователь ского режима, то мьютексы — объектами ядра. Кроме того, единственный объект-мью текс позволяет синхронизировать доступ к ресурсу нескольких потоков из разных процессов; при этом можно задать максимальное время ожидания доступа к ресурсу.
Именно благодаря этому мьютексу обеспечивается требование по безопасности при обращении к хранимой информации.
Инициализируется работа таймера:
Таймер необходим для того, чтобы с определённым интервалом обновлять хранимую информацию.
Для этого создаётся объект ядра «таймер»:
status = _ExAllocatePool( g_pTimer, NonPagedPool, sizeof( KTIMER ) );