USBDeviceAttach中LocalAlloc 异常 Device.exe

hd2046   2009-12-9 23:11 楼主
ce 5.0 USB驱动
USBDeviceAttach函数中使用LocalAlloc(LPTR,sizeof(struct pointer))
我现在的问题是:驱动在加载时,通常会在LocalAlloc处冒异常,不一定在哪个地方(不一定是哪一次调用),但基本上在连续两次调用LocalAlloc处(或前或后)。偶尔,会顺利的加载驱动。
我的理解是:在Device.exe的64K空间中分配内存给Drivers,可能由于我的板子上驱动比较多,分配在Device.exe堆空间中的内存也接近与64K(我用的NK是厂商给的,自己做的没法ActiveSync),所以我在分配时就出现异常:
信息如下:
ENDPOINT WILL be saved!
Pipe will be saved!
Data Abort: Thread=83d334a8 Proc=82126340 'device.exe'
AKY=00000005 PC=03fc3c18(coredll.dll+0x00053c18) RA=01b316f4(mbf_dll.dll+0x000016f4) BVA=06000004 FSR=00000007
Exception walking device interfaces

说明:前两句,对应的是LocalAlloc的提示保存两种结构体。之后就异常了(PC=03fc3c18(coredll.dll+0x00053c18)
请问:我的理解有没有可能,这样就只能从NK中去掉一些驱动了,还是有别的原因,请各位帮忙看一下

回复评论 (14)

LocalAlloc(LPTR,sizeof(struct pointer))????

pUSBD = (struct指针类型)LocalAlloc(LPTR, sizeof(struct));
点赞  2009-12-10 08:39
mbf_dll.dll?? 這是哪一個驅動??

Paul, Chao @ Techware
点赞  2009-12-10 08:50
引用: 引用 2 楼 paul_chao 的回复:
mbf_dll.dll?? 這是哪一個驅動??

Paul, Chao @ Techware

我的Device是MBF200,MBF_DLL.DLL是要加载的驱动
点赞  2009-12-10 11:17
引用: 引用 1 楼 oneonce 的回复:
LocalAlloc(LPTR,sizeof(struct pointer))????

pUSBD = (struct指针类型)LocalAlloc(LPTR, sizeof(struct));

试过了,
pPDD->lpEndPoint = (PUSB_ENDPOINT_DESCRIPTOR)LocalAlloc(LPTR,
sizeof(USB_ENDPOINT_DESCRIPTOR));
还是一样
点赞  2009-12-10 11:22
还真没遇到过这种情况。如果LocalAlloc分配不到足够的内存应该是会返回NULL的,也许你在使用前需要判断一下LocalAlloc的返值,再一个你的pPDD有没有可能也是NULL,再对它的成员变量进行赋值就会有0xc0000005错误了
点赞  2009-12-10 11:40
引用: 引用 4 楼 visualthinking 的回复:
试过了,
pPDD->lpEndPoint = (PUSB_ENDPOINT_DESCRIPTOR)LocalAlloc(LPTR,
sizeof(USB_ENDPOINT_DESCRIPTOR));
还是一样


完全是错误操作,你是要对pPDD进行申请内存的,你对pPDD结构没有弄清楚,再研究一下吧。我一开始也卡在这个结构体上。
pPDD = (pPDD类型的指针)LocalAlloc(LPTR, sizeof(pPDD类型));
点赞  2009-12-10 12:23
pPDD开始都没有申请内存就开始使用了,不异常都奇怪了,
而且你最好在usbFuncs->lpGetDeviceInfo之后才申请内存,要不然读什么描述否都是空谈。
点赞  2009-12-10 12:38
引用: 引用 7 楼 oneonce 的回复:
pPDD开始都没有申请内存就开始使用了,不异常都奇怪了,
而且你最好在usbFuncs->lpGetDeviceInfo之后才申请内存,要不然读什么描述否都是空谈。

//创建设备上下文       
        PDEVICECONTEXT pPDD = (PDEVICECONTEXT)LocalAlloc(LPTR,sizeof(DEVICECONTEXT));
                if(pPDD==0)
                {
                        RETAILMSG(1, (TEXT("Not enough memory!\r\n")));
                        SetLastError (ERROR_NOT_ENOUGH_MEMORY);
                        return FALSE;
                }
这是我第一次调用LocalAlloc的地方,在异常位置的前面.
这次LocalAlloc之后,又给pPDD的成员付了值,才开始给Pipe和EndPoint分配内存.
但是这次LocalAlloc没有错,到后面LocalAlloc时才出错
点赞  2009-12-10 15:54
引用: 引用 7 楼 oneonce 的回复:
pPDD开始都没有申请内存就开始使用了,不异常都奇怪了,
而且你最好在usbFuncs->lpGetDeviceInfo之后才申请内存,要不然读什么描述否都是空谈。

lpGetDeviceInfo(hDevice)那是在USBDeviceAttach开始的地方就调用了,要不然我怎么可能找到EndPoint
点赞  2009-12-10 16:00
引用: 引用 8 楼 visualthinking 的回复:
引用 7 楼 oneonce 的回复:
pPDD开始都没有申请内存就开始使用了,不异常都奇怪了,
而且你最好在usbFuncs->lpGetDeviceInfo之后才申请内存,要不然读什么描述否都是空谈。

//创建设备上下文
PDEVICECONTEXT pPDD = (PDEVICECONTEXT)LocalAlloc(LPTR,sizeof(DEVICECONTEXT));
if(pPDD==0)
{
RETAILMSG(1, (TEXT("Not enough memory!\r\n")));
SetLastError (ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
这是我第一次调用LocalAlloc的地方,在异常位置的前面.
这次LocalAlloc之后,又给pPDD的成员付了值,才开始给Pipe和EndPoint分配内存.
但是这次LocalAlloc没有错,到后面LocalAlloc时才出错



EndPoint是pPDD里面的成员,不用再申请内存了。
点赞  2009-12-10 18:58
嘿嘿,我说怎么这么奇怪呢。就是说lpEndPoint成员变量是结构而非结构指针?只是这命名容易让人误解
点赞  2009-12-11 09:31
关注,看看高手们是怎么解决的,学习
点赞  2009-12-11 10:45
引用: 引用 13 楼 oneonce 的回复:
下面是我的USB驱动:

接口描述如(一个USB可能有多个接口,所以会有pUSBD->bCurrentInterfaceIdx)
pInterface = &(pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces[pUSBD->bCurrentInterfaceIdx]);

端点描述符(一个接口下面可能有多个端点,所以会有j表示那个接口,k表示那个端点)
pEndpoint = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces+j)->lpEndpoints+k

主要是看你是不是对USB描述符和这个结构体理解的问题。

我的设备没那么复杂,就是两个EndPoint,
epDesc = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces->lpEndPoint[0];
epDesc = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces->lpEndPoint[1];
而且我用不到第二个端点,只有第一个来Bulk传输。
点赞  2009-12-12 00:05
这个问题在我重新做了一遍内核,删除了Device.exe下一些不必要的驱动和组件(winsock.ipv6....)之后,问题就没再出现。
谢谢,OneOnce,你帮我纠正了LocalAlloc(LPTR,sizeof(struct)),我原先用的是sizeof(struct pointer),当时没理解对。这个帖结了,新帖有关于IssueVendorTransfer控制传输的问题,望您继续关注
点赞  2009-12-12 00:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复