阅读:1597回复:10
数组增大就编译不过??
void do_nothing()
{ #define NAMELEN 2046 WCHAR name[NAMELEN]; swprintf(name, L"liudaocan"); } //为什么NAMELEN只能小于或者等于2044 //否则编译出错sfilter.obj : error LNK2019: unresolved external symbol __chkstk referenced in function _do_nothing@0 |
|
|
沙发#
发布于:2007-01-23 09:32
l老兄,节省点,堆栈空间不够了.
|
|
|
板凳#
发布于:2007-01-23 12:38
就算减少点能编译过,这也是潜在风险,还是从堆里申请吧
|
|
地板#
发布于:2007-01-24 08:35
确实是的啊!!
每次过一段时间就莫明其妙的蓝屏: BAD_POOL_HEADER PAGE_FAULT_IN_NONPAGEED_AREA |
|
|
地下室#
发布于:2007-01-24 09:25
一看就是初哥,想当年,也犯过这样的毛病
都把应用程序开发的那套经验用来开发驱动了.hehe |
|
|
5楼#
发布于:2007-01-27 10:44
我的驱动中就用2K的数组来保存文件头数据的, 怎么没有问题?
下面是我取文件加密头2k数据的代码片段,一直运行良好。 UCHAR DataBuffer[MAX_TRANSFER_SIZE]={'\0'};//用于装文件头部2k字节的内容 ULONG DataBufferLength = 0; LARGE_INTEGER FileSize={ 0,0 }; KdPrint(("IsEncrypted Routine\n")); UNREFERENCED_PARAMETER(DeviceObject); offset.QuadPart=0; FileSize= ((PFSRTL_COMMON_FCB_HEADER)((*PPfileObject)->FsContext))->FileSize; //如果文件大小不足加密标志的10个字节,那末放弃 if(FileSize.LowPart < FIRST_ENCRYPT_TAG_LENGTH ) { return FALSE; } DataBufferLength = (FileSize.LowPart < sizeof(UCHAR)*MAX_TRANSFER_SIZE)? FileSize.LowPart : sizeof(UCHAR)*MAX_TRANSFER_SIZE; mdl=IoAllocateMdl( DataBuffer, DataBufferLength,//sizeof(UCHAR)*MAX_TRANSFER_SIZE, FALSE, TRUE, 0); if (mdl == NULL) { KdPrint(("sfilter!IsEncrypted: IoAllocateMdl failed\n")); Status = STATUS_INSUFFICIENT_RESOURCES; return FALSE; } MmBuildMdlForNonPagedPool(mdl); KfcRead( DeviceObject, *PPfileObject, &offset, DataBufferLength,//sizeof(UCHAR)*MAX_TRANSFER_SIZE, //2k mdl, &iosb); if (!NT_SUCCESS(iosb.Status)) { return FALSE; } |
|
6楼#
发布于:2007-01-27 11:28
那是你运气好.hehe
驱动的堆栈非常有限,比较大的数据都需要从堆中分配 |
|
|
7楼#
发布于:2007-02-09 12:01
我也想从堆中分配非分页内存,可是读头操作很频繁,这样就容易产生内存碎片。
搂主之所以编译失败,可能是函数被过深的欠套调用,导致堆栈枯竭。 |
|
驱动小牛
|
8楼#
发布于:2007-02-12 14:32
lookasdide list可以避免碎片
|
|
9楼#
发布于:2007-02-12 14:59
旁视表只能分配固定大小的内存块,比如文件名之类..
|
|
|
10楼#
发布于:2007-02-23 16:03
我用旁视列表,取文件头数据,系统马上奔溃。所以就一直用栈了。
|
|