Как писать драйвера

Здесь есть возможность читать онлайн «Как писать драйвера» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Как писать драйвера: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Как писать драйвера»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Как писать драйвера — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Как писать драйвера», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

//

// Register the miniport with NDIS. Note that it is the miniport

// which was started as a driver and not the protocol. Also the miniport

// must be registered prior to the protocol since the protocol's BindAdapter

// handler can be initiated anytime and when it is, it must be ready to

// start driver instances.

//

NdisMInitializeWrapper(&WrapperHandle, DriverObject, RegistryPath, NULL);

NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_CHARACTERISTICS));

MChars.MajorNdisVersion = 4;

MChars.MinorNdisVersion = 0;

MChars.InitializeHandler = MPInitialize;

MChars.QueryInformationHandler = MPQueryInformation;

MChars.SetInformationHandler = MPSetInformation;

MChars.ResetHandler = MPReset;

MChars.TransferDataHandler = MPTransferData;

MChars.HaltHandler = MPHalt;

//

// We will disable the check for hang timeout so we do not

// need a check for hang handler!

//

MChars.CheckForHangHandler = NULL;

MChars.SendHandler = MPSend;

MChars.ReturnPacketHandler = MPReturnPacket;

//

// Either the Send or the SendPackets handler should be specified.

// If SendPackets handler is specified, SendHandler is ignored

//

// MChars.SendPacketsHandler = MPSendPackets;

Status = NdisIMRegisterLayeredMiniport(WrapperHandle, &MChars, sizeof(MChars), &DriverHandle);

ASSERT(Status == NDIS_STATUS_SUCCESS);

NdisMRegisterUnloadHandler(WrapperHandle, PtUnload);

//

// Now register the protocol.

//

NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

PChars.MajorNdisVersion = 4;

PChars.MinorNdisVersion = 0;

//

// Make sure the protocol-name matches the service-name under which this protocol is installed.

// This is needed to ensure that NDIS can correctly determine the binding and call us to bind

// to miniports below.

//

NdisInitUnicodeString(&Name, L"SFilter"); // Protocol name

PChars.Name = Name;

PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete;

PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete;

PChars.SendCompleteHandler = PtSendComplete;

PChars.TransferDataCompleteHandler = PtTransferDataComplete;

PChars.ResetCompleteHandler = PtResetComplete;

PChars.RequestCompleteHandler = PtRequestComplete;

PChars.ReceiveHandler = PtReceive;

PChars.ReceiveCompleteHandler = PtReceiveComplete;

PChars.StatusHandler = PtStatus;

PChars.StatusCompleteHandler = PtStatusComplete;

PChars.BindAdapterHandler = PtBindAdapter;

PChars.UnbindAdapterHandler = PtUnbindAdapter;

PChars.UnloadHandler = NULL;

PChars.ReceivePacketHandler = PtReceivePacket;

PChars.PnPEventHandler= PtPNPHandler;

NdisRegisterProtocol(&Status, &ProtHandle, &PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

ASSERT(Status == NDIS_STATUS_SUCCESS);

NdisIMAssociateMiniport(DriverHandle, ProtHandle);

return(Status);

}

Майкрософт утверждает что нам нужны 4 функции минимум, присутствующие в DriverEntry:

NdisMInitializeWrapper;

NdisIMRegisterLayeredMiniport;

NdisRegisterProtocol;

NdisIMAssociateMiniport.

NdisMInitializeWrapper – функция указывает системе NDIS, что пришло время инициировать miniport service в ее системе. Возвращаемое значение необходимо сохранить на будущее. Обязательно надо обратить внимание, что если происходит ошибка при инициализации любого объекта, то при уже нормально отработавшей функции NdisMInitializeWrapper нужно вызвать NdisTerminateWrapper для высвобождения ресурса.

NdisIMRegisterLayeredMiniport Функция, регистрирующая все функции уровня miniport

NdisRegisterProtocol Функция, регистрирующая все функции протокола

NdisIMAssociateMiniport. Функция, информирующая NDIS о том, что есть, существует два уровня, минипорт и протокол, и говорящая об экспорте функций, если таковой присутствует.

Теперь, для полной расшифровки этой шарады, посмотрим, как работает система драйвера, уже на уровне кода.

После того, как драйвер зарегистрирует функции группы miniport, он должен зарегистрировать полученный HANDLE, для правильной un-регистрации этих функций в момент окончания работы драйвера. Это делает функция NdisMRegisterUnloadHandler. Затем мы регистрируем протокольную группу и связываем эти две группы, сообщая NDIS об их существовании – функцией NdisIMAssociateMiniport.

На этом в нашем примере функция DriverEntry закачивается. Стоит немного пояснить еще несколько моментов работы инициализации. При работе на уровне kernel не стоит использовать функции: malloc, realloc, memset и т. д. Для этого существуют NdisZeroMemory, NdisAllocateMemory и др. Они более конкретно работают, и предназначены именно для использования в драйверах связанных с NDIS.

Конкретно сами функции, которые принадлежат группам, мы с вами будем рассматривать в процессе написания кода, да и то не все. Полное их описание вы уже посмотрите в DDK help. А мы с вами посмотрим на неявную третью группу.

Третья группа функций используется для коммуникации с аппликацией. Иногда и для непосредственного создания пакетов, и их отправки, как в случае с драйвером СОМ порта. В нашем случае драйвер пока никак не взаимодействует с уровнем аппликаций, поэтому их нет. Но, любой драйвер нуждается в управлении, наш пример, особенно, ибо он является тестовым и нам необходимо уметь давать нужные команды. Поэтому мы создадим и проинициализируем следующие функции:

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Как писать драйвера»

Представляем Вашему вниманию похожие книги на «Как писать драйвера» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Как писать драйвера»

Обсуждение, отзывы о книге «Как писать драйвера» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x