| 
			| 
					
						| 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 ... |  |  | 
	|  |