我在NDIS IM 的passthru.dll中在protocol.c中的ProtocolReceivePacket添加的代码,模拟器debug版本编译后行不
[复制链接]
NDIS中直接用CreatThread开启线程好像行不通??看我在NDIS IM 的passthru.dll中在protocol.c中的ProtocolReceivePacket添加的代码,如下,模拟器debug版本编译后行不通!说CreatThread警告视为错误。我的目的是获取数据包,分配自己的包,获取缓冲区数据然后写入共享内存,应用程序用EVC++写的,没有什么大问题,关键是内核驱动不好搞定,请教高人指点CE内核驱动的编写依据,参考的头文件,最重要的是解决我下面开启线程出错的问题,还有就是一些错误!
INT
ProtocolReceivePacket(
IN NDIS_HANDLE hProtocolBindingContext,
IN PNDIS_PACKET pPacket
)
{
省略。。。。。
NdisMIndicateReceivePacket(pBinding-> hMPBinding, &pIMPacket, 1);
//++++
DBGPRINT(("++==> PASSTHRU::show the copied packet buffer context++++++++\n"));
//把数据包内容从Packet拷贝到pPacketContent
NdisQueryPacket( pIMPacket,NULL,NULL,NULL,&PacketSize);
NdisAllocateMemoryWithTag(&pPacketContent,2000,PASSTHRU_MEMORY_TAG);
if (pPacketContent!=NULL)
{
NdisZeroMemory (pPacketContent, 2000);
NdisQueryBufferSafe(pIMPacket-> Private.Head, &pBuf, &BufLength, 32 );
NdisMoveMemory(pPacketContent, pBuf, BufLength);
i = BufLength;
pNext = pIMPacket-> Private.Head;
for(;;)
{
if(pNext == pIMPacket-> Private.Tail)
break;
pNext = pNext-> Next; //指针后移
if(pNext == NULL)
break;
NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
NdisMoveMemory((UCHAR*)pPacketContent+i,pBuf,BufLength);
i+=BufLength;
}
DBGPRINT(("+++++++++++++++now we should creat a thread to copy data and display ----------\n"));
}
//++然后创建线程对内存映射文件建立并且写入数据,
//当写完一个包后关闭文件。
//CreatThread(NULL,0,WriteMMFile, pPacketContent
//使用共享内存方式,因为减少了系统调用的开销,可以避免速度下降。
////添加的代码结束!
//
// Check if we had indicated up the packet with NDIS_STATUS_RESOURCES
// NOTE -- do not use NDIS_GET_PACKET_STATUS(MyPacket) for this since
// it might have changed! Use the value saved in the local variable.
//
if (status == NDIS_STATUS_RESOURCES) {
//
// Our ReturnPackets handler will not be called for this packet.
// We should reclaim it right here.
//
NdisFreePacket(pIMPacket);
}
iCode = (status != NDIS_STATUS_RESOURCES) ? 1 : 0;
}
cleanUp:
DBGPRINT(("++++++++++++++ProtocolReceivePacket Over!!!!!!!!!! ----------\n"));
return iCode;
}
//the created thread
INT WINAPI WriteThread(PVIOD pArg)
{
//创建线程实现传递copy的数据包pIMPacket做为参数传递,获取缓冲区数据。设置全局循环变量N(截取的包的个数)
//然后等待hWriteEvent(设置超时时间),如返回超时则线程返回,否则等待获得互斥体hMyMutex(设置超时则线程返回)得到权限
//然后打开内存映射文件,把buffer data写入内存映射文件N次,
//释放两次互斥体,线程返回(判断如果截取包次数到达N则设置释放两次互斥体,set hReadEvent,reset hWriteEvent,线程返回)
//利用事件对象hReadEvent促发App等待线程,(App线程在调用等待中获得互斥体,得到对文件的读取权限,读取数据,
//释放互斥体,set hWriteEnent,reset hReadEvent,进入循环等待)代码如下
//------------------------------------------------------------------------------
//把数据包内容从Packet拷贝到pPacketContent
static UINT N=0;
static DWORD dwOffset=0;
PNDIS_PACKET pIMPacket;
UINT PacketSize;
PVOID pPacketContent;
LPBYTE pBuf;
UINT BufLength;
NDIS_BUFFER * pNext;
UINT i;
INT rc;
*PNDIS_HANDLE hMyMutex;
*PNDIS_HANDLE hMyFile,hMyFileMap;
PBYTE pMyFileMem;
LPTSTR szMyFileName="MyFile";
LPTSTR lpWriteEventName="MyWriteEvent";
LPTSTR lpReadEventName="MyReadEvent";
LPTSTR lpMutextName="MyMutex";
//INT rs;
pIMPacket=(PNDIS_PACKET)pArg;
NdisQueryPacket( pIMPacket,NULL,NULL,NULL,&PacketSize);
NdisAllocateMemoryWithTag(&pPacketContent,2000,PASSTHRU_MEMORY_TAG);
if (pPacketContent!=NULL)
{
NdisZeroMemory (pPacketContent, 2000);
NdisQueryBufferSafe(pIMPacket-> Private.Head, &pBuf, &BufLength, 32 );
NdisMoveMemory(pPacketContent, pBuf, BufLength);
i = BufLength;
pNext = pIMPacket-> Private.Head;
for(;;)
{
if(pNext == pIMPacket-> Private.Tail)
break;
pNext = pNext-> Next; //指针后移
if(pNext == NULL)
break;
NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
NdisMoveMemory((UCHAR*)pPacketContent+i,pBuf,BufLength);
i+=BufLength;
}
}
//然后等待hWriteEvent(设置超时时间),如返回超时则线程返回,否则等待获得互斥体(设置超时则线程返回)得到权限
hWriteEvent=CreatEvent(NULL,TRUE,TURE,lpWriteEventName);
hReadEvent=CreatEvent(NULL,TRUE,TRUE,lpReadEnentName);
if(!hWriteEvent ? ?!hReadEvent)
return -1;
rc=WaitForSingleObject(hWriteEvent,2000);
if(rc==WAit_OBJECT_0){
hMyMutex=CreatMutex(NULL,TURE, lpMutextName);
// rs=GetLastError();
//if(rs==ERROR_ALREADY_EXISTS)
rc=WaitForSingleObject(hMyMutex,2000);
if(rc!=WAit_OBJECT_0)
return 0;
//然后打开内存映射文件,把buffer data写入内存映射文件N次,
hMyFile = CreateFileForMapping (szMyFileName, GENERIC_READ ? GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hMyFile== INVALID_HANDLE_VALUE) {
hMyFile = 0;
return GetLastError();
}
hMyFileMap=CreatFileMapping(hMyFile,NULL,PAGE_MAP_WRITE,0,0,0);
if(hMyFileMap==INVALID_HANDLE_VALUE)
{
CloseHandle(hMyFile);
return 0;
}
pMyFileMem=(LPBYTE) MapViewOfFile ( hMyFileMap, FILE_MAP_ALL_ACCESS , 0, dwOffset, 0 );
if(pMyFileMem){
//use the data in my file
NdisMoveMemory(pMyFileMem,pPacketContent,i);
N++;
UnmapViewOfFile(pMyFileMem);
}
CloseHandle(hMyFileMap);
CloseHandle(hMyFile);
//释放两次互斥体,线程返回(判断如果截取包次数到达N则设置释放两次互斥体,set hReadEvent,reset hWriteEvent,线程返回)
ReleaseMutex(hMyMutex);
ReleaseMutex(hMyMutex);
if(N> 5)
{
SetEvent(hReadEvent);
ResetEvent(hWriteEvent);
}
return 1;
}
else
return -1;
}
//添加线程结束