Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: USB DS 3.2 Создание и отправка своего запроса Bulk  (Прочитано 13374 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Seventh_
Интересующийся

ua
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 09-10-2013 10:14 » 

IRQL_NOT_LESS_OR_EQUAL?
блин, опять классы нумеги?  Жаль
где размещен CmdToDevice? размер? откуда BULK_OUT?
не хочется в них разбираться. поэтому давайте проще...
скомпилите отладочную версию. включите в настройках ОС запись дампа памяти при краше системы. после BSOD откройте его в WinDbg. сможете найти строку на которой упало.
PS и вообще уже столько писал - не используйте эти классы.)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Seventh_
Интересующийся

ua
Offline Offline

« Ответ #2 : 09-10-2013 11:04 » 

спасибо за ответ.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 09-10-2013 13:05 » 

да, пардон, не внимательно прочел что падает на SubmitUrb.
а кроме того вы не привели инициализацию классов и переменных которые используете - без нее тут вообще ничего нельзя сказать.
код отсюда брали?
http://projects.qi-hardware.com/svn/ingenic-tools-usb-boot/trunk/src/host/Usb%20Boot/Usb_Boot_Driver/Usb_Boot_Driver_Device.cpp
по крайней мере похожий... или это полностью рыба с нумеги? попробуйте сравнить
« Последнее редактирование: 09-10-2013 13:11 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Seventh_
Интересующийся

ua
Offline Offline

« Ответ #4 : 09-10-2013 13:27 » new

Из переменных, которые инициализируются не в 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 09-10-2013 14:10 » 

вроде ничего такого не вижу на первый взгляд. а падает именно при вызове или уже по комплиту?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Seventh_
Интересующийся

ua
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 09-10-2013 15:14 » 

это минидамп судя по названию. там в настройках полный можно выставить, там чуть больше информации будет.
мой комп-свойства-вкладка дополнительно.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Seventh_
Интересующийся

ua
Offline Offline

« Ответ #8 : 11-10-2013 08:25 » 

По полному дампу видно, что ошибка в usbport.sys. как выясню - выложу полную реализацию.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Seventh_
Интересующийся

ua
Offline 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_
Интересующийся

ua
Offline Offline

« Ответ #11 : 24-10-2013 08:40 » 

Решение нашел. Вся загвоздка была в отправке на DISPATCH_LEVEL,а  Allocate исполняется на APC_LEVEL.
Создал поток и из него отправляю все свои IRP.
код выложу по отладке.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 24-10-2013 11:43 » 

 Годится!
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines