Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, pva, Вы писали:
pva>>Использовать поиск и найти как включить отладочный вывод.
А>в каждой функции на каждом важном этапе у меня прописан DebugPrint. А>вот пример: А>DebugPrint((_TRACE_ENTRY, "%s Begin.\n", szFnName));
А>спец прогой их отлавливаю, но ничего не ловится.
А>поиск по данному запросу ничего нового мне не подсказал. не затруднитесь объяснить пожалуйста. =*
А ты включил вывод debug messages? По умолчанию начиная с Vista такие сообщения отключенны.
ну я дураак))
оказывается всё очень просто
как у меня записан самый первый параметр в DriverEntry:
IN PDRIVER_OBJECT *DriverObject,
естественно он указателю место не найдёт =D
убрал указатель всё сразу быстренько встало)
огромное спасибо)
это мой первый драйвер, так что буду рад любым комментариям. Ошибка может быть в какойто глупости.
значит написал драйвер. Хочу его поставить. Сначала выдавал ошибку — Возможно драйвер повреждён или отсутствует (код 39)
т.к. ставлю удалённо с хр на сервер 2003 то проверил наличие wdfldr.sys только на хр. на сервере не оказалось. подсунул на сервер с хр.
теперь такую ошибку выдаёт:
код 03. драйвер повреждён или нехватает памяти для загрузки.
в setupapi пишет вот так:
#I163 Устройство не запущено: обнаружена проблема: 0x03: CM_PROB_OUT_OF_MEMORY.
драйвер выделяет буфер памяти в 256 мб. но я так понимаю до него дело не доходит, т.к. даже дебаг принты из драйверЕнтери не выводит.
подскажите пожалуйста, в чём может быть проблема?
Здравствуйте, smithana, Вы писали:
S>драйвер выделяет буфер памяти в 256 мб. но я так понимаю до него дело не доходит, т.к. даже дебаг принты из драйверЕнтери не выводит. S>подскажите пожалуйста, в чём может быть проблема?
Использовать поиск и найти как включить отладочный вывод.
newbie
Re[2]: проблема с WDF драйвером Raid контроллера
От:
Аноним
Дата:
04.04.11 20:15
Оценка:
Здравствуйте, pva, Вы писали:
pva>Использовать поиск и найти как включить отладочный вывод.
в каждой функции на каждом важном этапе у меня прописан DebugPrint.
вот пример:
DebugPrint((_TRACE_ENTRY, "%s Begin.\n", szFnName));
спец прогой их отлавливаю, но ничего не ловится. следовательно до них дело не доходит, ведь так?
и так же смотрю сообщения системы в setupapi файле.
поиск по данному запросу ничего нового мне не подсказал. не затруднитесь объяснить пожалуйста. =*
Здравствуйте, smithana,
S>так как я только начинаю, думаю дело в чём то очень простом. S>так что буду рад любым вариантом, проверю всё что только скажите.
--
Включите и посмотрите setupapi.log (см. здесь) и, для WDF, setupact.log (см. здесь)
А как вы устанавливаете драйвер? Через .INF файл?
S>драйвер выделяет буфер памяти в 256 мб. но я так понимаю до него дело не доходит, т.к. даже дебаг принты из драйверЕнтери не выводит. S>подскажите пожалуйста, в чём может быть проблема?
Здравствуйте, dimb82, Вы писали:
D>А как вы устанавливаете драйвер? Через .INF файл?
да через него. сегодня воткнули железку на другой комп, на котором обычный хр стоит. при установке сразу же ругнулся что не хватает wdfldr.sys (с сервером мучался долго, пока не понял что его не хватало). когда подпихнули ему и повторили попытку выдал синий экран. потом просмотрев файл ошибки, поняли что проблема уже в driver.sys.
А CoInstaller для WDF у вас прописан в .INF файле?
D>>А как вы устанавливаете драйвер? Через .INF файл?
S>да через него. сегодня воткнули железку на другой комп, на котором обычный хр стоит. при установке сразу же ругнулся что не хватает wdfldr.sys (с сервером мучался долго, пока не понял что его не хватало). когда подпихнули ему и повторили попытку выдал синий экран. потом просмотрев файл ошибки, поняли что проблема уже в driver.sys.
Может в них дело?
S>да конечно последний 1009 версии.
S>[CoInstaller_CopyFiles] S>wdfcoinstaller01009.dll
S>[SourceDisksFiles] S>wdfcoinstaller01009.dll=1 ; make sure the number matches with SourceDisksNames
убрал выделение массива в 256 мб, и добавил строки по поводу коинсталлера в инф файл.
никаких изменений нет, по прежнему код 3 и в setupapi пишет:
#I163 Устройство не запущено: обнаружена проблема: 0x03: CM_PROB_OUT_OF_MEMORY.
Сегодня целый день трахался, нихрена(
на сервере 03, переставили железку(рейд контроллер) в другой слот. отключил полностью AddDevice, т.е. он остался просто как заглушка. Поставил на сервер, сказал что установил и попросил перезагрузку хоть в инф файле её и не прописывал. После перезагрузки выдал bsod с замечательной строчкой: виновник — wdf01000.sys
он был 2006 года, подпихнул вместо него с ХР 2009, размером отличались, переустановил, опять bsod и он же виновник. убрал уже из DriverEntry DebugPrint, т.е. тупо остался DriverEntry и заглушка AddDevice. и всё равно bsod с кодом — 000007Е. (кол-во нулей не помню). что говорит о том что опять проблемы с памятью. На ХР поставить не удалось пока.
вот DriverEntry и AddDevice:
#include "includes.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, SataRaidAddDevice)
#endif
NTSTATUS DriverEntry(IN PDRIVER_OBJECT *DriverObject,
IN PUNICODE_STRING RegistryPath){
WDF_DRIVER_CONFIG config;
KdPrint(("Windows Sata Raid Controller Driver.\n"));
KdPrint(("Built %s %s\n", __DATE__, __TIME__));
WDF_DRIVER_CONFIG_INIT(&config, SataRaidAddDevice);
return WdfDriverCreate(*DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);
}
NTSTATUS SataRaidAddDevice(IN WDFDRIVER Driver,
IN PWDFDEVICE_INIT DeviceInit){
DECLARE_CONST_UNICODE_STRING(ntDeviceName, NT_DEVICE_NAME);
WDF_OBJECT_ATTRIBUTES queueAttributes; //Аттрибуты очереди
WDF_OBJECT_ATTRIBUTES deviceAttributes; //Аттрибуты устройства
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks; //Обработчики вызовов энергопотребления
PDEVICE_EXTENSION pDE; //Личные параметры ус-ва. См. .h
WDFDEVICE device; //Часть параметров ус-ва
WDFMEMORY memory;
WDF_IO_QUEUE_CONFIG ioQueueConfig; //Часть параметров оч-ди
WDFQUEUE queue; //Часть параметров оч-ди
NTSTATUS status; //проверка
PQUEUE_EXTENSION pQueueContext = NULL; //Личные параметры оч-ди
PHYSICAL_ADDRESS nPhysAddr; //Физический Адрес
void *pDataBuf; //Буфер
UINT32 nAllocSize; //Размер буфера
LARGE_INTEGER nLowAddr, //Минимальный адрес буфера
nMaxAddr, //Максимальный адрес буфера
nDataAlign; //Выравнивание адреса буфера
UINT32 *pBusSlotData;
size_t bufferLength;
PAGED_CODE();
UNREFERENCED_PARAMETER(Driver);
/* status = WdfDeviceInitAssignName(DeviceInit, &ntDeviceName);
if (!NT_SUCCESS(status)){
return status;
}
WdfDeviceInitSetDeviceType(DeviceInit, FILE_DEVICE_DISK);
WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
WdfDeviceInitSetExclusive(DeviceInit, FALSE);
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
//
// These two callbacks set up and tear down hardware state,
// specifically that which only has to be done once.
//
pnpPowerCallbacks.EvtDevicePrepareHardware = SataRaidPrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = SataRaidReleaseHardware;
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, DEVICE_EXTENSION);
deviceAttributes.EvtCleanupCallback = SataRaidEvtDeviceContextCleanup;
status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device);
if (!NT_SUCCESS(status)) {
return status;
}
pDE = DeviceGetExtension(device);
pDE->Device = device;
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig, WdfIoQueueDispatchSequential);
ioQueueConfig.EvtIoDeviceControl = SataRaidDeviceDispatcher;
ioQueueConfig.EvtIoRead = SataRaidIoRead;
ioQueueConfig.EvtIoWrite = SataRaidIoWrite;
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&queueAttributes, QUEUE_EXTENSION);
status = WdfIoQueueCreate(device, &ioQueueConfig, &queueAttributes, &queue );
if (!NT_SUCCESS(status)) {
return status;
}
// Context is the Queue handle
pQueueContext = QueueGetExtension(queue);
pQueueContext->DeviceExtension = pDE;
//
// Obtaining bus and slot number.
//
status = WdfDeviceAllocAndQueryProperty(device,
DevicePropertyBusNumber,
NonPagedPool,
&deviceAttributes,
&memory);
if (!NT_SUCCESS(status)){
return status;
}
pBusSlotData = WdfMemoryGetBuffer(memory, &bufferLength);
if (bufferLength < sizeof(UINT32)){
return STATUS_INSUFFICIENT_RESOURCES;
}
pDE->m_nBusNumber = *pBusSlotData;
WdfObjectDelete(memory);
status = WdfDeviceAllocAndQueryProperty(device,
DevicePropertyAddress,
NonPagedPool,
&deviceAttributes,
&memory);
if (!NT_SUCCESS(status)){
return status;
}
pBusSlotData = WdfMemoryGetBuffer(memory, &bufferLength);
if (bufferLength < sizeof(UINT32)){
return STATUS_INSUFFICIENT_RESOURCES;
}
pDE->m_nSlotNumber = *pBusSlotData;
WdfObjectDelete(memory);
//
// Create a WDFINTERRUPT object.
//
status = SataRaidInterruptCreate(pDE);
if (!NT_SUCCESS(status)){
return status;
}
//
// Initialize DMA.
//
nAllocSize = SATARAID_DMABUFFER_SIZE;
nDataAlign.QuadPart = nAllocSize;
nLowAddr.QuadPart = 0;
nMaxAddr.QuadPart = 0xFFFFFFFFFFFFFFFF;
pDataBuf = MmAllocateContiguousMemorySpecifyCache(nAllocSize,
nLowAddr, nMaxAddr, nDataAlign, MmCached);
pDE->m_pDataBuf = pDataBuf;
nPhysAddr = MmGetPhysicalAddress(pDataBuf);
WriteBarDword(pDE, 0, 0x1000, nPhysAddr.LowPart);
WriteBarDword(pDE, 0, 0x1004, nPhysAddr.HighPart);
pDE->m_nChannel = 0;
pDE->m_nTotalChannels = 1;
return status;*/
return STATUS_SUCCESS;
}
Что читать, где смотреть? Начальник уже зарплату отказывается выдавать(
есть приложение, которое работает с железкой. на старом драйвере (неPnP) она видит железку, на новом не видит.
думал что Vendor и Device ID или имя железки в дереве реестра и в драйвере не совпадают.
оказалось что приложение к ID никакой привязки не имеет, а имя в дереве записывается, оно как раз с драйвера и берётся.
дерево просматривал в реестре — HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum там только Vendor, Device ID.
и WinObj просматривал в папке Device. там как раз появляется уст-во с имененем прописанным в драйвере:
Здравствуйте, smithana, Вы писали:
S>дерево просматривал в реестре — HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum там только Vendor, Device ID. S>и WinObj просматривал в папке Device. там как раз появляется уст-во с имененем прописанным в драйвере:
S>#define NT_DEVICE_NAME L"\\Device\\sraid" S>#define DOS_DEVICE_NAME L"\\DosDevices\\"
S>правда дос нэйм не нашёл.
MS не рекомендует использование DOS-имён. я обхожусь интерфейсами устройства, а класс для поиска устройств с заданным GUID в user-mode имеется у Walter Oney.
Здравствуйте, Imian, Вы писали:
I>MS не рекомендует использование DOS-имён. я обхожусь интерфейсами устройства, а класс для поиска устройств с заданным GUID в user-mode имеется у Walter Oney.
мало чего понял(
1. у меня драйвер не в юзер моде, а в режиме ядра.
2. Подскажите пожалуйста что на эту тему почитать или что вообще гуглить?