锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 濡傛灉鏈枃瀵逛綘鐨勫紑鍙戞湁鎵甯姪錛屽茍涓斾綘鎵嬪ご鎭板ソ鏈夐浂閽便?/p> 涓嶅鎵撹祻鎴戜竴鏉挅鍟★紝榧撳姳鎴戠戶緇垎浜紭縐鐨勬枃绔犮?br />
瑙e喅鍔炴硶錛氫慨鏀筍tring綾伙紝浣跨敤utf16鏉ヤ唬鏇緾EGUI鐨剈tf32銆?br>浼樼偣錛?br>瑙e喅浜嗗唴瀛樺崰鐢ㄨ繃澶氱殑闂錛屼竴涓瓧絎﹀彧瑕?涓瓧鑺傚氨鍙互浜嗭紱
瑙e喅浜嗚皟璇曢棶棰橈紝VS2005鐩存帴鏀寔utf16鐨勬樉紺恒?br>緙虹偣錛?br>鍙兘涓嶆敮鎸佸叏涓栫晫鐨勫瓧絎︼紝鍥犱負utf16涓嶈兘琛ㄧず瓚呰繃16浣嶇殑瀛楃錛屼絾鏄紝瀵逛簬澶у鏁板浗瀹剁殑瀛楃鏉ヨ錛屽凡緇忚凍澶熶簡錛屾瘯绔焪indows2000/xp涔熸槸鍩轟簬utf16緙栫爜鐨勩?br>
鐒跺悗錛屼笅闈㈡槸淇敼鍚庣殑瀛楃涓茬被錛?a title=CEGUIString href="http://m.shnenglu.com/Files/mybios/CEGUIString.rar">CEGUIString
浣跨敤鏄緢綆鍗曠殑錛岀敤鍛戒護琛屾柟寮忔墽琛岋細
patch 婧愭枃浠?琛ヤ竵鏂囦歡
渚嬪鎴戜滑鏈夋簮鏂囦歡test.cpp錛屼笅杞戒簡涓ˉ涓佹枃浠秚est.patch錛岄偅涔堟墽琛宲atch test.cpp test.patch錛屽氨浼氳嚜鍔ㄦ妸patch閲岀殑鍐呭鏇存柊鍒皌est.cpp涓幓浜嗐?br />
PS錛歝ygwin璨屼技涔熸湁榪欎釜宸ュ叿鍚с傘備互鍓嶇湅榪囬噷闈㈠ソ鍍忚繕鏈塪iff宸ュ叿錛屽彲浠ョ敓鎴恜atch鏂囦歡錛屽懙鍛點?br />
榪樻湁
void GridPartition::enumerateConnectedPartitions(vector<CorePartition*>& connected)
{
//get surrounding grid cells within a certain radius
float loadRadius = mGridPartitionMgr->getGridCellLoadRadius();
//enumerate partitions
vector<CorePartition*> partitions;
mGridPartitionMgr->enumeratePartitions(partitions);
//iterate through and check distance
for(vector<CorePartition*>::iterator itr = partitions.begin(); itr != partitions.end(); ++itr)
{
float distance = Vector3(getWorldPosition() - (*itr)->getWorldPosition()).length();
// add by 鏉庨敠淇?2007-7-16
// 涓嶈榪斿洖鑷繁浣滀負閭誨眳錛屼細浜х敓bug
if(distance < loadRadius && *itr != this)
connected.push_back(*itr);
}
}
鍐嶇粰鍑轟竴涓瘮杈冧弗閲嶇殑bug
GOOFTranslationManipulator.h涓殑
// add by 鏉庨敠淇?2007-7-12
// 涓嶈鐢ㄩ瓟鏈暟錛屾悶鍒扮紦瀛樻孩鍑?br /> SceneNode* mNode[AT_LAST];
Entity* mEnt[AT_LAST];
Entity* mConeEnt[AT_LAST];
CollisionShapePtr mCol[AT_LAST];
AxisManipulatorHandle* mHandle[AT_LAST];
鍙﹀錛孋orePartition涓殑setSkyboxMaterial銆乻etGlobalAmbient涔嬬被鐨勪唬鐮佽矊浼兼病鐢ㄣ傚噯澶囧純涔嬨?br />
銆銆浣犲彲鑳戒笉甯屾湜鍦ㄥ彂甯冪▼搴忔椂闄勫甫涓婁竴涓閮ㄧ殑 DLL錛屽洜涓哄彲鑳戒細鏈変簺鐢ㄦ埛鍦ㄦ棤鎰忎腑鎶?DLL 鍒犻櫎浜嗚岄犳垚 EXE 涓嶈兘姝g‘榪愯錛屼篃鏈夊彲鑳借 DLL 浼氳鍒漢鎷垮幓浣跨敤錛屼篃鏈夊彲鑳斤紝姝?DLL 浼氭垚涓虹牬瑙h呯牬瑙d綘鐨勭▼搴忕殑紿佺牬鍙c傛棤璁哄嚭浜庝綍縐嶅師鍥狅紝濡傛灉浣犳兂鎶婁竴涓?DLL 鍚堝茍鍒頒竴涓?EXE 涓殑璇濓紝鏈枃鍚戜綘浠嬬粛榪欑鏂規(guī)硶銆?
Win32 紼嬪簭璋冪敤 DLL 鐨勬満鍒?/strong>LPVOID sRawDll; // 璧勬簮鏂囦歡鍦ㄥ唴瀛樹腑鐨勫湴鍧
HRSRC hRes;
HMODULE hLibrary;
HGLOBAL hResourceLoaded;
char lib_name[MAX_PATH];
GetModuleFileName(hInstance, lib_name, MAX_PATH ); // 寰楀埌榪愯紼嬪簭鐨勫悕瀛?
hLibrary = LoadLibrary(lib_name); // 灝辮薄杞藉叆涓涓?DLL 涓鏍瘋澆鍏ヨ繍琛岀▼搴忓埌鍐呭瓨涓?
if (NULL != hLibrary)
{
// 寰楀埌鎸囧畾鐨勮祫婧愭枃浠跺湪鍐呭瓨涓殑浣嶇疆
hRes = FindResource(hLibrary, MAKEINTRESOURCE(IDR_DATA1), RT_RCDATA);
if (NULL != hRes)
{
// 灝嗚祫婧愭枃浠惰澆鍏ュ唴瀛?
hResourceLoaded = LoadResource(hLibrary, hRes);
if (NULL != hResourceLoaded)
{
// 寰楀埌璧勬簮鏂囦歡澶у皬
SizeofResource(hLibrary, hRes);
// 閿佸畾璧勬簮浠ュ緱鍒板畠鍦ㄥ唴瀛樹腑鐨勫湴鍧
sRawDll = (LPVOID)LockResource(hResourceLoaded);
}
}
else return 1;
FreeLibrary(hLibrary);
}
else return 1;
鐒跺悗錛屼粠璧勬簮涓澆鍏?DLL 鍒板唴瀛樺嚱鏁?LoadPbDllFromMemory 灝嗚澆鍏?DLL 鍒板唴瀛樹腑錛?璇ュ嚱鏁版湁涓や釜鍙傛暟錛岀涓涓弬鏁版槸鎸囧悜 DLL 璧勬簮鍦ㄥ唴瀛樹腑鐨勫湴鍧鐨勬寚閽堬紝涔熷氨鏄墠闈唬鐮佷腑鐨?LockResource 鍑芥暟鐨勮繑鍥炲箋傜浜屼釜鍙傛暟鏄竴涓┖鐨勬寚閽堬紝濡傛灉鍑芥暟 LoadPbDllFromMemory 榪愯鎴愬姛錛岃鎸囬拡灝嗘寚鍚戦噸鏂扮粍鍚堝悗鐨勫唴瀛樹腑鐨?DLL 鐨勮搗濮嬪湴鍧銆傝鍑芥暟榪樻湁涓涓姛鑳藉氨鏄鏋滆繍琛屾垚鍔燂紝瀹冨皢鎵嬪姩鍦扮敤 DLL_PROCESS_ATTACH 鍙傛暟璋冪敤 DLL 鐨勫叆鍙e嚱鏁?DllMain 鏉ュ垵濮嬪寲璇?DLL銆傞櫎姝や箣澶栵紝瀹冭繕浼氭墜鍔ㄥ湴杞藉叆鍚堝茍鐨?DLL 鐨勫叆鍙h〃涓鍏ョ殑 DLL 騫惰皟鏁村畠浠湪鍐呭瓨涓殑鐩稿鍦板潃銆備互涓嬫槸璇ュ嚱鏁頒唬鐮?DWORD LoadPbDllFromMemory(LPVOID lpRawDll, LPVOID lpImageDll)
{
SYSTEM_INFO sSysInfo;
PIMAGE_DOS_HEADER dosHeader;
PIMAGE_NT_HEADERS pNTHeader;
PIMAGE_SECTION_HEADER section;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc;
PIMAGE_IMPORT_BY_NAME pOrdinalName;
PIMAGE_BASE_RELOCATION baseReloc;
PDWORD lpLink;
unsigned char Protection[4096];
HINSTANCE hDll;
WORD i;
DWORD ImagePages,fOldProtect,j,MaxLen,HdrLen,Addr1,Addr2,Pg,Pg1,Pg2;
char * sDllName;
if(NULL == lpRawDll) return 1 ;
dosHeader = (PIMAGE_DOS_HEADER)lpRawDll;
// Is this the MZ header?
if ((TRUE == IsBadReadPtr(dosHeader,sizeof (IMAGE_DOS_HEADER))) ||
(IMAGE_DOS_SIGNATURE != dosHeader->e_magic))
return 2;
// Get the PE header.
pNTHeader = MakePtr(PIMAGE_NT_HEADERS,dosHeader,dosHeader->e_lfanew);
// Is this a real PE image?
if((TRUE == IsBadReadPtr(pNTHeader,sizeof ( IMAGE_NT_HEADERS))) ||
( IMAGE_NT_SIGNATURE != pNTHeader->Signature))
return 3 ;
if(( pNTHeader->FileHeader.SizeOfOptionalHeader !=
sizeof(pNTHeader->OptionalHeader)) ||
(pNTHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC))
return 4;
if (pNTHeader->FileHeader.NumberOfSections < 1) return 5;
section = IMAGE_FIRST_SECTION( pNTHeader );
int HeaderSize = sizeof(IMAGE_SECTION_HEADER);
// 鑺傚ご闀垮害
HdrLen = (DWORD)section - (DWORD)dosHeader +
HeaderSize * pNTHeader->FileHeader.NumberOfSections;
// 鎵懼嚭鏈澶х殑鑺傜殑闀垮害,姝よ妭涓鑸槸浠g爜鎵鍦ㄧ殑鑺?.text 鑺?
MaxLen = HdrLen;
int ii=0;
for (i = 0;i<(DWORD)pNTHeader->FileHeader.NumberOfSections;i++)// find MaxLen
{
if(MaxLen < section[i].VirtualAddress + section[i].SizeOfRawData)
{
MaxLen = section[i].VirtualAddress + section[i].SizeOfRawData;
}
if(strcmp((const char *)section[i].Name,".rsrc") == 0) ii=i;
}
GetSystemInfo(&sSysInfo);
ImagePages = MaxLen / sSysInfo.dwPageSize;
if (MaxLen % sSysInfo.dwPageSize) ImagePages++;
// 鍒嗛厤鎵闇鐨勫唴瀛?
DWORD NeededMemory = ImagePages * sSysInfo.dwPageSize;
lpImageDll = VirtualAlloc(NULL, NeededMemory, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (lpImageDll == NULL) return 6; // 鍒嗛厤鍐呭瓨澶辮觸
MoveMemory( lpImageDll, lpRawDll, HdrLen ); // 澶嶅埗鑺傚ご
DWORD OrgAddr = 0;
DWORD NewAddr = 0;
DWORD Size = 0;
// 澶嶅埗 .text 鑺傛暟鎹?
for (i = 0;i<pNTHeader->FileHeader.NumberOfSections;i++)
{
OrgAddr = (DWORD)lpImageDll + (DWORD)section[i].VirtualAddress;
NewAddr = (DWORD)lpRawDll + (DWORD)section[i].PointerToRawData;
Size = (DWORD)section[i].SizeOfRawData;
MoveMemory((void *)OrgAddr, (void *)NewAddr, Size );
}
// 鎶婃寚閽堟寚鍚戞柊鐨?DLL 鏄犲儚
dosHeader = (PIMAGE_DOS_HEADER) lpImageDll; // Switch to new image
pNTHeader = (PIMAGE_NT_HEADERS) ((DWORD)dosHeader + dosHeader->e_lfanew);
section = (PIMAGE_SECTION_HEADER) ((DWORD)pNTHeader + sizeof(IMAGE_NT_HEADERS));
pImageBase = (PBYTE)dosHeader;
if((ii!=0) && (IsNT()==TRUE))
{
section[ii].VirtualAddress = section[ii].VirtualAddress + (DWORD)lpRawDll;
section[ii].PointerToRawData = section[ii].PointerToRawData + (DWORD)lpRawDll;
}
DWORD importsStartRVA;
// Look up where the imports section is (normally in the .idata section)
// but not necessarily so. Therefore, grab the RVA from the data dir.
importsStartRVA = GetImgDirEntryRVA(pNTHeader,IMAGE_DIRECTORY_ENTRY_IMPORT);
if ( !importsStartRVA )
{
VirtualFree(dosHeader,0, MEM_RELEASE);
return 7;
}
pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) pNTHeader->
OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
if(pImportDesc!= 0)
pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ((DWORD)pImportDesc + (DWORD)dosHeader);
else
{
VirtualFree(dosHeader,0, MEM_RELEASE);
return 8;
}
while (1) // 澶勭悊鍚勫叆鍙h〃涓殑 DLL
{
// 媯鏌ユ槸鍚﹂亣鍒頒簡絀虹殑 IMAGE_IMPORT_DESCRIPTOR
if ((pImportDesc->TimeDateStamp==0 ) && (pImportDesc->Name==0)) break;
// 浠庣鐩樿澆鍏ュ繀欏葷殑 Dll,
// 娉ㄦ剰,杞藉叆鐨?DLL 鏄悎騫剁殑 DLL 鐨勫叆鍙h〃涓殑 DLL,
// 涓嶆槸鍚堝茍鍒?EXE 涓殑 DLL
sDllName = (char *) (pImportDesc->Name + (DWORD)pImageBase);
hDll = GetModuleHandle(sDllName);
if (hDll == 0 ) hDll = LoadLibrary(sDllName);
if (hDll == 0 )
{
MessageBox(NULL, "Can''t find required Dll",
"Error in LoadPbDllFromMemory()",0);
VirtualFree(dosHeader,0, MEM_RELEASE);
return 9;
}
DWORD *lpFuncNameRef = (DWORD *) (pImportDesc->OriginalFirstThunk +
(DWORD)dosHeader);
DWORD *lpFuncAddr = (DWORD *) (pImportDesc->FirstThunk +
(DWORD)dosHeader);
while( *lpFuncNameRef != 0)
{
pOrdinalName = (PIMAGE_IMPORT_BY_NAME) (*lpFuncNameRef +
(DWORD)dosHeader);
DWORD pIMAGE_ORDINAL_FLAG = 0x80000000;
if (*lpFuncNameRef & pIMAGE_ORDINAL_FLAG)
*lpFuncAddr = (DWORD) GetProcAddress(hDll,
(const char *)(*lpFuncNameRef & 0xFFFF));
else
*lpFuncAddr = (DWORD) GetProcAddress(hDll,
(const char *)pOrdinalName->Name);
if (lpFuncAddr == 0)
{
VirtualFree(dosHeader,0, MEM_RELEASE);
return 10;// Can''t GetProcAddress
}
lpFuncAddr++;
lpFuncNameRef++;
}
pImportDesc++;
}
DWORD TpOffset;
baseReloc = (PIMAGE_BASE_RELOCATION)((DWORD)pNTHeader->
銆銆銆銆 OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
if (baseReloc !=0)
{
baseReloc = (PIMAGE_BASE_RELOCATION) ((DWORD)baseReloc + (DWORD)dosHeader);
while(baseReloc->VirtualAddress != 0)
{
PWORD lpTypeOffset = (PWORD) ((DWORD)baseReloc +
sizeof(IMAGE_BASE_RELOCATION));
while (lpTypeOffset < (PWORD)((DWORD)baseReloc +
(DWORD)baseReloc->SizeOfBlock))
{
TpOffset = *lpTypeOffset & 0xF000;
if(TpOffset == 0x3000)
{
lpLink = (PDWORD) ((DWORD)dosHeader +
銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆 baseReloc->VirtualAddress +
(*lpTypeOffset & 0xFFF));
*lpLink = (DWORD)dosHeader +
(*lpLink) - pNTHeader->OptionalHeader.ImageBase;
}
else
{
if (TpOffset != 0)
{
VirtualFree(dosHeader,0, MEM_RELEASE);
return 10;
}
}
lpTypeOffset++;
}
baseReloc = (PIMAGE_BASE_RELOCATION)((DWORD)baseReloc +
(DWORD)baseReloc->SizeOfBlock);
}
}
// 鍙栧緱鍘熷鐨勫唴瀛樼姸鎬?
memset(Protection,0,4096);
for (i = 0;i<=pNTHeader->FileHeader.NumberOfSections;i++)
{
if (i == pNTHeader->FileHeader.NumberOfSections)
{
Addr1 = 0;
Addr2 = HdrLen;
j = 0x60000000;
}
else
{
Addr1 = section[i].VirtualAddress;
Addr2 = section[i].SizeOfRawData;
j = section[i].Characteristics;
}
Addr2 += Addr1 - 1;
Pg1 = Addr1 / sSysInfo.dwPageSize;
Pg2 = Addr2 / sSysInfo.dwPageSize;
for(Pg = Pg1 ;Pg<=Pg2;Pg++)
{
if (j & 0x20000000) Protection[Pg] |= 1; // Execute
if (j & 0x40000000) Protection[Pg] |= 2; // Read
if (j & 0x80000000) Protection[Pg] |= 4; // Write
}
}
// 鎭㈠鍘熷鐨勫唴瀛樼姸鎬?
Addr1 = (DWORD)dosHeader;
for (Pg = 0 ;Pg<= ImagePages;Pg++)
{
switch(Protection[Pg])
{
case 2:
fOldProtect = PAGE_READONLY;
break;
case 3:
fOldProtect = PAGE_EXECUTE_READ;
break;
case 6:
fOldProtect = PAGE_READWRITE;
break;
default:
// Ignore strange combinations
fOldProtect = PAGE_EXECUTE_READWRITE;
break;
}
if (fOldProtect !=PAGE_EXECUTE_READWRITE)
{
if (VirtualProtect((void *)Addr1,
sSysInfo.dwPageSize,
fOldProtect,
&fOldProtect) == 0)
{
VirtualFree(dosHeader,0, MEM_RELEASE);
return 11;
}
}
Addr1 += sSysInfo.dwPageSize;
}
EntryPoint = (LPENTRYPOINT) ((DWORD)pNTHeader->OptionalHeader.AddressOfEntryPoint +
(DWORD)dosHeader);
LPVOID lpReserved = 0;
EntryPoint((HINSTANCE)dosHeader, DLL_PROCESS_ATTACH, lpReserved);
lpImageDll2=lpImageDll;
return 0;
}
銆銆涓浣?DLL 琚紜湴杞藉叆鍒板唴瀛樹腑錛屾垜浠氨鍙互閫氳繃鑷畾涔夊嚱鏁?GetProcAddressDirectly 鏉ヨ幏鍙栨煇鍑芥暟鍦ㄥ唴瀛樹腑鐨勫湴鍧錛屽茍鏍規(guī)嵁璇ュ湴鍧鏉ヨ皟鐢ㄨ鍑芥暟錛岃鍑芥暟涔熸湁涓や釜鍙傛暟錛岀涓涓弬鏁版槸鎸囧悜杞藉叆鍒板唴瀛樹腑鐨?DLL 鐨勮搗濮嬪湴鍧鐨勬寚閽堬紝絎簩涓槸瑕佽皟鐢ㄧ殑鍑芥暟鐨勫嚱鏁板悕銆備互涓嬫槸 GetProcAddressDirectly 鍑芥暟浠g爜: DWORD GetProcAddressDirectly(PIMAGE_DOS_HEADER dosHeader, char * FuncName)
{
PIMAGE_NT_HEADERS pNTHeader;
PIMAGE_EXPORT_DIRECTORY pExportDir;
PWORD lpNameOrdinals;
LPDWORD lpFunctions;
DWORD * lpName;
char * lpExpFuncName;
DWORD i;
DWORD j;
char * lpFuncName;
if(dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return 0;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + dosHeader->e_lfanew);
if (pNTHeader->Signature != IMAGE_NT_SIGNATURE) return 0;
if ((pNTHeader->FileHeader.SizeOfOptionalHeader != sizeof(pNTHeader->OptionalHeader)) ||
(pNTHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC))
return 0;
DWORD exportsStartRVA, exportsEndRVA;
pImageBase = (PBYTE)dosHeader;
// Make pointers to 32 and 64 bit versions of the header.
pNTHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader,dosHeader->e_lfanew );
exportsStartRVA = GetImgDirEntryRVA(pNTHeader,IMAGE_DIRECTORY_ENTRY_EXPORT);
exportsEndRVA = exportsStartRVA +
GetImgDirEntrySize(pNTHeader, IMAGE_DIRECTORY_ENTRY_EXPORT);
// Get the IMAGE_SECTION_HEADER that contains the exports. This is
// usually the .edata section, but doesn''t have to be.
PIMAGE_SECTION_HEADER header;
header = GetEnclosingSectionHeader( exportsStartRVA, pNTHeader );
if ( !header ) return 0;
INT delta;
delta = (INT)(header->VirtualAddress - header->PointerToRawData);
pExportDir = (PIMAGE_EXPORT_DIRECTORY)GetPtrFromRVA(exportsStartRVA,
pNTHeader, pImageBase);
pExportDir =(PIMAGE_EXPORT_DIRECTORY) (pNTHeader->
OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
if (pExportDir == 0)
{
MessageBox(NULL,"Error in GetProcAddressDirectly()",0,0);
return 0;
}
pExportDir =(PIMAGE_EXPORT_DIRECTORY) ((DWORD)pExportDir + (DWORD)dosHeader);
lpNameOrdinals =(PWORD)((DWORD)pExportDir->AddressOfNameOrdinals + (DWORD)dosHeader);
lpName =(LPDWORD) (pExportDir->AddressOfNames + (DWORD)dosHeader);
lpFunctions =(LPDWORD) (pExportDir->AddressOfFunctions + (DWORD)dosHeader);
lpFuncName = FuncName;
if(HIWORD(lpFuncName)!=0 )
{
for( i = 0;i<=pExportDir->NumberOfFunctions - 1;i++)
{
DWORD entryPointRVA = *lpFunctions;
// Skip over gaps in exported function
if ( entryPointRVA == 0 ) continue;
for( j = 0;j<=pExportDir->NumberOfNames-1;j++)
{
if( lpNameOrdinals[j] == i)
{
lpExpFuncName = (char *) (lpName[j] +
(DWORD)dosHeader);
if(strcmp((char *)lpExpFuncName,(char *)FuncName)==0)
return (DWORD) (lpFunctions[i] +
(DWORD)dosHeader);
}
}
}
}
else
{
for (i = 0 ;i<=pExportDir->NumberOfFunctions - 1;i++)
{
if (lpFuncName == (char *)(pExportDir->Base + i))
{
if (lpFunctions[i]) return (unsigned long) (lpFunctions[i] +
dosHeader);
}
}
}
return 0;
}
鍦ㄨ皟鐢ㄥ畬鍑芥暟鍚庯紝涓嶈蹇樿鐢?UnloadPbDllFromMemory 鏉ヤ粠鍐呭瓨涓Щ鍘?DLL 浠ラ噴鏀懼垎閰嶇殑鍐呭瓨錛岃鍑芥暟榪樹細鐢?DLL_PROCESS_DETACH 鍙傛暟璋冪敤 DLL 鐨勫叆鍙e嚱鏁?DllMain 鏉ヤ粠璋冪敤榪涚▼鐨勫湴鍧絀洪棿鍗歌澆璇?DLL銆?浠ヤ笅鏄?UnloadPbDllFromMemory 鍑芥暟浠g爜:DWORD UnloadPbDllFromMemory(PIMAGE_DOS_HEADER dosHeader)
{
PIMAGE_NT_HEADERS pNTHeader;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + (DWORD)dosHeader->e_lfanew);
EntryPoint = (LPENTRYPOINT)(pNTHeader->OptionalHeader.AddressOfEntryPoint +
(DWORD)dosHeader);
EntryPoint((HINSTANCE)dosHeader, DLL_PROCESS_DETACH, 0);
return VirtualFree(dosHeader, 0, MEM_RELEASE);
}
鍏充簬紺轟緥浠g爜鐨勮鏄?/strong>銆銆鍦ㄦ湰鏂囬檮甯︾殑紺轟緥浠g爜涓紝鍚堝茍浜嗕竴涓悕涓?hardware.dll 鐨勫姩鎬佽繛鎺ュ簱錛岃鍔ㄦ佽繛鎺ュ簱鏄竴涓幏鍙栫郴緇熺‖浠朵俊鎭殑搴撴枃浠訛紝鍏朵腑鍖呮嫭浜嗕互涓嬪嚱鏁?
getmac 鍙栧緱緗戝崱 MAC VolumeNumber 鍙栧緱紜洏鍗鋒爣 changeres 鏀瑰彉灞忓箷鍒嗚京鐜? IsDiskInDrive 媯鏌ヨ蔣椹變腑鏄惁鎻掓湁鐩?nbsp; DPGetDefaultPrinter 鍙栧緱榛樿鐨勬墦鍗版満鍚? DPSetDefaultPrinter 璁劇疆榛樿鐨勬墦鍗版満 getserial 鍙栧緱紜洏鐨勫嚭鍘傚簭鍒楀彿 getmetric 鍙栧緱鏄劇ず鍒嗚京鐜? PrintStringDirect 鐩存帴鍚戞墦鍗版満鍙戦佷竴涓覆 vfpbeep 璁?PC 鍠囧彮鍙戝0 getcpuid 鍙栧緱 CPU ID getbios 鍙栧緱涓繪澘 BIOS ID銆銆鍦ㄧず渚嬩唬鐮佷腑錛屽彧璋冪敤浜嗗叾涓竴涓嚱鏁?getbios 鏉ヨ幏鍙栦富鏉?BIOS ID錛?榪欓噷璇存槑涓涓嬶紝璇ュ嚱鏁板疄闄呬笂濂借薄鍙兘媯嫻?AWARD 涓繪澘鐨?BIOS錛?涔熷氨鏄瀹冩槸璇誨彇鐨勬槸緋葷粺鍐呭瓨 0x000fex71 澶勭殑鍊箋傚洜涓哄叾瀹冪墝瀛愮殑涓繪澘 BIOS 鐨勪綅緗◢鏈変笉鍚岋紝浣嗗湪紼嬪簭涓病鏈夎繘琛岃繖鏂歸潰鐨勫鐞嗭紝鎵浠ュ湪璇誨叾瀹冪墝瀛愮殑涓繪澘 BIOS 鏃跺彲鑳戒細鏈変簺闂(璇誨嚭鐨勫唴瀹瑰彲鑳戒笉姝g‘)銆傚叧浜庢 DLL 鐨勫唴瀹瑰拰瀹炵幇錛屼篃璁告垜浼氬湪鍙︿竴綃囨枃绔犱腑璁哄強銆?
灞闄?br />銆銆鍦ㄦ垜榪涜嫻嬭瘯鏃訛紝鍙戠幇瀵逛簬鏈変簺鍚湁璧勬簮鐨?DLL錛屽湪 9x 騫沖彴涓嬪彲鑳戒細鏈夐棶棰樸?br />
棰樺璇?br />銆銆鍙﹀錛屽叾瀹冧竴浜涙湰鏂囨湭鎻愬強鐨勯潪涓昏鐨勫嚱鏁幫紝璇瘋嚜琛屽弬瑙佹簮浠g爜涓殑娉ㄩ噴銆?br />鍐嶏紝鏈枃娑夊強 PE 鏂囦歡鏍煎紡鏂歸潰鐨勭煡璇嗭紝瀹冧滑宸茬粡瓚呭嚭浜嗘湰鏂囩殑鑼冨洿錛屽叿浣撲俊鎭彲鍙傝 MSDM 涓殑:
鐗瑰埆鎰熻阿鍗㈡槬鏄庯紙Aming錛夊湪鎴戠紪鍐欐湰鏂囨椂鎵浣滅殑涓浜涙妧鏈柟闈㈢殑寤鴻鍜屾寚瀵?/strong>
濡傛灉鏈枃瀵逛綘鐨勫紑鍙戞湁鎵甯姪錛屽茍涓斾綘鎵嬪ご鎭板ソ鏈夐浂閽便?/p>
涓嶅鎵撹祻鎴戜竴鏉挅鍟★紝榧撳姳鎴戠戶緇垎浜紭縐鐨勬枃绔犮?br />
/* 鏉ヨ嚦 Quake 3 鐨勬簮鐮?*/ float CarmSqrt(float x){union{int intPart; float floatPart; } convertor; union{int intPart; float floatPart; } convertor2; convertor.floatPart = x; convertor2.floatPart = x; convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1); convertor2.intPart = 0x5f3759df - (convertor2.intPart >> 1); return0.5f*(convertor.floatPart + (x * convertor2.floatPart)); }
union luai_Cast {double l_d; long l_l; }; #define lua_number2int(i,d) \{volatileunion luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }
unsignedshort alpha_blender(unsignedint x,unsignedint y,unsignedint alpha){ x = (x | (x<<16)) & 0x7E0F81F; y = (y | (y<<16)) & 0x7E0F81F; unsignedint result = ((x - y) * alpha / 32 + y) & 0x7E0F81F; return(unsignedshort)((result&0xFFFF) | (result>>16)); }
unsignedlong hash(constchar *name,size_t len){unsignedlong h=(unsignedlong)len; size_t step = (len>>5)+1; for(size_t i=len; i>=step; i-=step) h = h ^ ((h<<5)+(h>>2)+(unsignedlong)name[i-1]); return h; }
int UTF8toUTF16(int c){signedchar *t=(signedchar*)&c; int ret=*t &(0x0f | ((*t>>1) &0x1f) | ~(*t>>7)); int i; assert ((*t & 0xc0) != 0x80); for(i=1;i<3;i++){if((t[i] & 0xc0)!=0x80){break; } ret=ret<<6 | (t[i] & 0x3f); }return ret; }
AGEIA鐨凱hysX澶勭悊鍣ㄦ槸涓栫晫涓婇嬈劇墿鐞嗘ā鎷熷鐞嗗櫒 (PPU), 璇ュ鐞嗗櫒灝嗚В闄や腑澶鐞嗗櫒榪涜鐗╃悊妯℃嫙鐨勮礋鎷呫侾hysX PPU 鐨勮璁℃瀯鏋跺熀浜庨《鐐圭殑澶氱嚎紼嬫搷浣滐紝鍏佽娓告垙寮鍙戜漢鍛樿繘琛岀簿紜佹祦鐣呭拰鍔ㄧ敾鍒涗綔鍜岃繍鍔ㄦā鎷燂紝渚嬪姣涘彂銆佸竷鏂欍佹恫浣撱佹祦浣撶瓑銆傛湰鏂囦粙緇嶄簡濡備綍鍒╃敤PhysX SDK鐗╃悊寮曟搸寮鍙戝寘鏉ュ疄鐜版垜浠豢鐪熺殑鏁堟灉銆?/p>
聽聽