HANDLE hMyThread1=NULL; HANDLE hMyThread2=NULL; HANDLE hMyThread3=NULL; ULONG ulAverAddress=0; NTSTATUS ntstatus; pStartEndAddress pStartAndEndAddress1;//定义结构体变量,存放起始和结束地址 pStartEndAddress pStartAndEndAddress2; pStartEndAddress pStartAndEndAddress3; ULONG ulAddress[2]; //uladdress[0] StartAddress //uladdress[1] EndAddress pStartAndEndAddress1= ExAllocatePoolWithTag(PagedPool,sizeof(StartEndAddress),'F1'); KeInitializeEvent(&event,NotificationEvent,FALSE); ExInitializeFastMutex(&fm_Address); GetAddressRange(ulAddress);//得到地址的起始和结束 ulAverAddress=(ulAddress[1]-ulAddress[0])/4;//求出每个平均地址 pStartAndEndAddress1->ulStartAddress=ulAddress[0]; pStartAndEndAddress1->ulEndAddress=ulAddress[0]+ulAverAddress; ntstatus=PsCreateSystemThread(&hMyThread1 ,0 ,NULL ,(HANDLE)0 ,NULL ,DoFind1 ,(PVOID)pStartAndEndAddress1); if (!NT_SUCCESS(ntstatus)) { return; } pStartAndEndAddress2= ExAllocatePoolWithTag(PagedPool,sizeof(StartEndAddress),'F1'); pStartAndEndAddress2->ulStartAddress=ulAddress[0]+ulAverAddress; pStartAndEndAddress2->ulEndAddress=ulAddress[0]+2*ulAverAddress; ntstatus=PsCreateSystemThread(&hMyThread2 ,0 ,NULL ,(HANDLE)0 ,NULL ,DoFind2 ,(PVOID)pStartAndEndAddress2); if (!NT_SUCCESS(ntstatus)) { return; }
在多线程传递参数的时候,不要用同一个局部变量反复付新的值,创建线程时用于传递参数,可能这个线程还没运行,但是他的值就变了。也不要用一个局部变量,申请堆地址传递在释放,在申请用于新的线程参数,同样问题也会出现。传递的可能是释放后的数据。