Seventh_
Интересующийся
Offline
|
|
« : 09-10-2013 08:16 » |
|
Суть проблемы в следующем. Пытаюсь сформировать IRP запрос внутри драйвера. При попытке вызвать SubmitUrb получаю BSOD 0x0A(0x60, 0x02, 0x01, 0x...)
VOID USB_UNODevice::SendSuspendingCmd(PVOID Arg1, PVOID Arg2) { NTSTATUS status = STATUS_SUCCESS;
T.Trace(TraceInfo, __FUNCTION__" Allocate\n");
m_Stacks = m_Lower.StackRequirement(); m_KIrp2 = KIrp::Allocate(m_Stacks); m_KIrp2.SetNextStackLocation(); ULONG dwTotalSize = 2048; T.Trace(TraceInfo, __FUNCTION__" BuildBulkTransfer\n");
PURB pUrb = BULK_OUT.BuildBulkTransfer( pData->CmdToDevice, dwTotalSize, FALSE, NULL, TRUE ); if (pUrb == NULL) { KIrp::Deallocate(m_KIrp2); m_KIrp2 = NULL; return ; }
T.Trace(TraceInfo, __FUNCTION__" urb .... %x\n", pUrb); USB_COMPLETION_INFO* pInfo = new (NonPagedPool) USB_COMPLETION_INFO; T.Trace(TraceInfo, __FUNCTION__" pInfo\n"); RtlZeroMemory(pInfo,sizeof(USB_COMPLETION_INFO)); // Initialize context structure pInfo->m_pClass = this; pInfo->m_pUrb = pUrb;
T.Trace(TraceInfo, __FUNCTION__" info ... %x\n", pInfo); T.Trace(TraceInfo, __FUNCTION__" pIrp 0x%x\n", m_KIrp2); // status = BULK_OUT.SubmitUrb(m_KIrp2, pUrb, LinkTo(CompleteMyIRP), pInfo);//, Timeout T.Trace(TraceInfo, __FUNCTION__" pIrp 0x%x status %x\n", m_KIrp2, status); }
NTSTATUS USB_UNODevice::CompleteMyIRP(KIrp I, USB_COMPLETION_INFO* pContext) { if(I->PendingReturned) I.MarkPending(); NTSTATUS status = I.Status(); PURB pUrb = pContext->m_pUrb; ULONG nBytesWritten = 0; nBytesWritten = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength; T.Trace(TraceInfo, "===== OUT L = %d\n", nBytesWritten); if(pUrb) delete pUrb; pUrb = NULL;
if(pContext) delete pContext; pContext = NULL;
I.Information() = nBytesWritten;
DecrementOutstandingRequestCount(); return status; }
Как следует грамотно создавать и отправлять запрос?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 09-10-2013 10:14 » |
|
IRQL_NOT_LESS_OR_EQUAL? блин, опять классы нумеги? где размещен CmdToDevice? размер? откуда BULK_OUT? не хочется в них разбираться. поэтому давайте проще... скомпилите отладочную версию. включите в настройках ОС запись дампа памяти при краше системы. после BSOD откройте его в WinDbg. сможете найти строку на которой упало. PS и вообще уже столько писал - не используйте эти классы.)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Seventh_
Интересующийся
Offline
|
|
« Ответ #2 : 09-10-2013 11:04 » |
|
спасибо за ответ.
|
|
|
Записан
|
|
|
|
|
Seventh_
Интересующийся
Offline
|
|
« Ответ #4 : 09-10-2013 13:27 » |
|
Из переменных, которые инициализируются не в SendSuspendCmd 1. Десткриптор канала Bulk // Initialize the lower device m_Lower.Initialize(this, Pdo);
m_Interface.Initialize( m_Lower, //KUsbLowerDevice 0, //InterfaceNumber 1, //ConfigurationValue 0 //Initial Interface Alternate Setting );
// Initialize each Pipe object BULK_IN.Initialize(m_Lower, 0x86, 65535); BULK_OUT.Initialize(m_Lower, 0x02, 2048);
2. буфер с комадой
PHYSICAL_ADDRESS lowAddress; PHYSICAL_ADDRESS highAddress; PHYSICAL_ADDRESS skipAddress; lowAddress.QuadPart = 0x00000000; highAddress.QuadPart = 0xA0000000; skipAddress.QuadPart = 0x00100000; SIZE_T totalBytes = 2048; MDLData = MmAllocatePagesForMdl(lowAddress, highAddress, skipAddress, totalBytes); T.Trace(TraceInfo, __FUNCTION__" AllocatedPages.\n");
if(!MDLData) { I->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; I->IoStatus.Information = 0; return status; } __try {
pSysMemVirtAddr = MmMapLockedPagesSpecifyCache(MDLData, KernelMode, MmCached, NULL, FALSE, HighPagePriority);
} __except (EXCEPTION_EXECUTE_HANDLER) { T.Trace(TraceInfo, "Error MmMapLockedPagesSpecifyCache !!! \n"); MmFreePagesFromMdl(MDLData); return GetExceptionCode(); }
T.Trace(TraceInfo, __FUNCTION__" .. DATA_POINRER: MDLData = 0x%8.8x pSysMemVirtAddr = 0x%8.8x \n", MDLData, pSysMemVirtAddr); pData->CmdToDevice = (PINTERCHANGE_STRUCT)((ULONG)MmGetSystemAddressForMdlSafe(MDLData,HighPagePriority)); if(pData->CmdToDevice== NULL) { I->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;//STATUS_UNSUCCESSFUL; I->IoStatus.Information = 0; IoCompleteRequest(I,IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; }
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #5 : 09-10-2013 14:10 » |
|
вроде ничего такого не вижу на первый взгляд. а падает именно при вызове или уже по комплиту?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Seventh_
Интересующийся
Offline
|
|
« Ответ #6 : 09-10-2013 14:13 » |
|
При вызове, вот кстати и дамп. (Дамп памяти, с пылу, с жару) Loading Dump File [E:\Temp\dmp\100113-22152-01.dmp] Mini Kernel Dump File: Only registers and stack trace are available
Invalid directory table base value 0x0 Symbol search path is: C:\Windows\symbols;E:\Symbols Executable search path is: Unable to load image Unknown_Module_00000000, Win32 error 0n2 *** WARNING: Unable to verify timestamp for Unknown_Module_00000000 Unable to add module at 00000000 WARNING: .reload failed, module list may be incomplete Debugger can not determine kernel base address Windows 7 Kernel Version 7601 (Service Pack 1) MP (2 procs) Free x86 compatible Product: WinNt, suite: TerminalServer SingleUserTS Built by: 7601.17514.x86fre.win7sp1_rtm.101119-1850 Machine Name: Kernel base = 0x82c49000 PsLoadedModuleList = 0x82d93850 Debug session time: Tue Oct 1 16:01:43.399 2013 (UTC + 3:00) System Uptime: 0 days 0:09:13.628 Unable to load image Unknown_Module_00000000, Win32 error 0n2 *** WARNING: Unable to verify timestamp for Unknown_Module_00000000 Unable to add module at 00000000 WARNING: .reload failed, module list may be incomplete Debugger can not determine kernel base address Loading Kernel Symbols .Unable to load image Unknown_Module_00000000, Win32 error 0n2 *** WARNING: Unable to verify timestamp for Unknown_Module_00000000 Unable to add module at 00000000
Loading User Symbols ******************************************************************************* * * * Bugcheck Analysis * * * *******************************************************************************
Use !analyze -v to get detailed debugging information.
BugCheck A, {60, 2, 1, 82cff876}
***** Debugger could not find nt in module list, module list might be corrupt, error 0x80070057.
Probably caused by : Unknown_Image ( ANALYSIS_INCONCLUSIVE )
Followup: MachineOwner ---------
0: kd> !analyze -v ******************************************************************************* * * * Bugcheck Analysis * * * *******************************************************************************
IRQL_NOT_LESS_OR_EQUAL (a) An attempt was made to access a pageable (or completely invalid) address at an interrupt request level (IRQL) that is too high. This is usually caused by drivers using improper addresses. If a kernel debugger is available get the stack backtrace. Arguments: Arg1: 00000060, memory referenced Arg2: 00000002, IRQL Arg3: 00000001, bitfield : bit 0 : value 0 = read operation, 1 = write operation bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status) Arg4: 82cff876, address which referenced memory
Debugging Details: ------------------
***** Debugger could not find nt in module list, module list might be corrupt, error 0x80070057.
WRITE_ADDRESS: unable to get nt!MmSpecialPoolStart unable to get nt!MmSpecialPoolEnd unable to get nt!MmPagedPoolEnd unable to get nt!MmNonPagedPoolStart unable to get nt!MmSizeOfNonPagedPoolInBytes 00000060
CURRENT_IRQL: 0
FAULTING_IP: +0 82cff876 8701 xchg eax,dword ptr [ecx]
CUSTOMER_CRASH_COUNT: 1
DEFAULT_BUCKET_ID: WIN7_DRIVER_FAULT
BUGCHECK_STR: 0xA
LAST_CONTROL_TRANSFER: from 82cff876 to 82c8a5cb
STACK_TEXT: WARNING: Frame IP not in any known module. Following frames may be wrong. 82d71af4 82cff876 badb0d00 00000000 85511002 0x82c8a5cb 82d71b88 82cc1bff 86c8b818 00000000 00000000 0x82cff876 82d71bd0 8db2430d 82c840e8 8575c008 00000000 0x82cc1bff 82d71c00 8db24f55 86ae91a8 86c8b7d8 857c2b40 0x8db2430d 82d71c2c 8db256f6 85aca028 85aca0f0 85acaa98 0x8db24f55 82d71c54 8db219ce 85aca028 85acaa98 85aca002 0x8db256f6 82d71c78 82cc11b5 85acaaa4 85aca002 00000000 0x8db219ce 82d71cd4 82cc1018 82d74d20 82d7e380 00000000 0x82cc11b5 82d71d20 82cc0e38 00000000 0000000e 00000000 0x82cc1018 82d71d24 00000000 0000000e 00000000 00000000 0x82cc0e38
STACK_COMMAND: kb
SYMBOL_NAME: ANALYSIS_INCONCLUSIVE
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: Unknown_Module
IMAGE_NAME: Unknown_Image
DEBUG_FLR_IMAGE_TIMESTAMP: 0
BUCKET_ID: CORRUPT_MODULELIST
Followup: MachineOwner ---------
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 09-10-2013 15:14 » |
|
это минидамп судя по названию. там в настройках полный можно выставить, там чуть больше информации будет. мой комп-свойства-вкладка дополнительно.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Seventh_
Интересующийся
Offline
|
|
« Ответ #8 : 11-10-2013 08:25 » |
|
По полному дампу видно, что ошибка в usbport.sys. как выясню - выложу полную реализацию.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #9 : 11-10-2013 11:10 » |
|
ваших функций в стеке видимо нет? значит что то не так с входными параметрами... попробуйте повнимательней посмотреть на параметры инициализации и на значения по умолчанию которые вы используете при вызове. сравнивая с исходником по той ссылке что я выше приводил - мне показалось у вас количество входных параметров разное.
Добавлено через 4 минуты и 51 секунду: и они там память в BuildBulkTransfer дают при помощи: KMemory Mem(I.Mdl()) а вы используете MmGetSystemAddressForMdlSafe() что там должно быть?
Добавлено через 1 минуту и 23 секунды: последний параметр BuildBulkTransfer - TRUE - это что?
Добавлено через 34 секунды: SubmitUrb - пятый параметр по умолчанию - чем?
|
|
« Последнее редактирование: 11-10-2013 11:17 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Seventh_
Интересующийся
Offline
|
|
« Ответ #10 : 14-10-2013 09:18 » |
|
ваших функций в стеке видимо нет? значит что то не так с входными параметрами... попробуйте повнимательней посмотреть на параметры инициализации и на значения по умолчанию которые вы используете при вызове. сравнивая с исходником по той ссылке что я выше приводил - мне показалось у вас количество входных параметров разное.
Ничавчем разное. URB мой, если его поместить в Irp, созданный автоматически, при вызове, DeviceIoControl, то запрос завершается успешно, что-то не заполнено в Irp, который я создал сам. Сейчас сравниваю поля двух запросов (мой и автоматически созданный) и копаю в этом направлении. и они там память в BuildBulkTransfer дают при помощи: KMemory Mem(I.Mdl()) а вы используете MmGetSystemAddressForMdlSafe() что там должно быть?
Разница состоит в том, что KMemory Mem(I.Mdl()) извлекли таблицу страниц из автоматически созданного запроса I и скопировали её в новую - Mem. А я выделяю память заново и в запрос отдаю свою таблицу, тут ошибок нет, проверено. последний параметр BuildBulkTransfer - TRUE - это что?
Разрешить короткую передачу, передача меньше максимального размера pipe SubmitUrb - пятый параметр по умолчанию - чем?
По умолчанию задержка отправки = 0
|
|
|
Записан
|
|
|
|
Seventh_
Интересующийся
Offline
|
|
« Ответ #11 : 24-10-2013 08:40 » |
|
Решение нашел. Вся загвоздка была в отправке на DISPATCH_LEVEL,а Allocate исполняется на APC_LEVEL. Создал поток и из него отправляю все свои IRP. код выложу по отладке.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 24-10-2013 11:43 » |
|
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|