Библиотека для драйверов устройств

Я сделал библиотеку для отображения в памяти любого файла формата PE, дело в том, что я сделал это только пользователем, используя Visual Studio 2013 со стандартным форматом .lib. Означает ли это, что мою библиотеку нельзя использовать внутри драйвера устройства?

Например, у меня есть следующий фрагмент:

    HMODULE ntdllmod = LoadLibraryA("ntdll.dll");
if (ntdllmod)
{
ZwQueryInformationProcess func = (ZwQueryInformationProcess)GetProcAddress(ntdllmod, "ZwQueryInformationProcess");
}

Это хорошо работает на земле пользователя, но в ядре мне не нужно вызывать GetProcAddress, я просто могу напрямую вызвать ZwQueryInformationProcess, так как это экспорт ntoskrnl … Не могу ли я, например, сделать это ?:

#IF USER_LAND
HMODULE ntdllmod = LoadLibraryA("ntdll.dll");
if (ntdllmod)
{
ZwQueryInformationProcess func = (ZwQueryInformationProcess)GetProcAddress(ntdllmod, "ZwQueryInformationProcess");
}
#elif KERNEL_MODE
//Run my Kernel version code here.

Если это невозможно, то как я могу создать библиотеку драйверов устройств в VS2013? (не могу найти опцию) Также может помочь любое руководство или справочная информация о том, как связать библиотеку драйверов, если она отличается от обычной библиотеки.

РЕДАКТИРОВАТЬ: я уже знаю об использовании ZwQueryInformationProcess, вопрос заключается в том, могу ли я использовать директиву препроцессора #IF для создания библиотеки драйверов или библиотеки режима пользователя и иметь обе реализации в одном решении.

Благодарю.

0

Решение

Да, вы можете использовать #if производить другой код, где это необходимо. Вам, вероятно, придется определить свой собственный -D или же #define контролировать, является ли библиотека «ядром» или «пользовательским режимом».

Часто лучше разделить «функции, которые не являются общими», на один или несколько модулей (включая файлы, скажем «usermode-stuff.c» и «kernel-stuff.c», соответственно, как часть исходные файлы проекта), где тот же тип функции объявлен для общего использования. Это позволяет избежать огромного количества #if KERNEL_MODE по всему коду, который может стать довольно грязным через некоторое время.

Очевидно, что это само по себе не обязательно означает, что вы можете делать все, что вам нужно, или что ваш проект может быть достигнут — в вашем вопросе недостаточно подробностей, чтобы ответить на него.

0

Другие решения

Я бы объяснил только случай функции ZwQueryInformationProcess.
ZwQueryInformationProcess уже экспортируется с помощью ntoskrnl.exe,
и тогда вы можете использовать его легко.

  1. включить заголовочный файл.

ex) #include «ntddk.h»

  1. или объявить ZwQueryInformationProcess
    ех)

NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess (
В РУЧКЕ
IN ULONG ProcessInformationClass,
OUT PVOID ProcessInformation,
INLONG ProcessInformationLength,
OUT PULONG ReturnLength НЕОБЯЗАТЕЛЬНО);

  1. добавьте ntoskrnl.lib в исходный файл.

  2. наконец, вы можете использовать его. вот и все.

ех)

ULONG GetProcessID(HANDLE ProcessHandle, PPEB* ppPeb )
{
NTSTATUS Status;
PROCESS_BASIC_INFORMATION ProcInfo;

Status = ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, &ProcInfo, sizeof(ProcInfo), NULL);
if (STATUS_SUCCESS == ntStatus) {
if (ppPeb) {
*ppPeb = ProcInfo.PebBaseAddress;
}
return ProcInfo.UniqueProcessId;
}
return 0;
}
1

По вопросам рекламы [email protected]