HUniform FxGetUniform( FxShader* shader, const char* name ) { mxASSERT_PTR(shader); HUniform uniform; uniform.SetNil(); for( UINT iCB = 0; iCB < shader->localCBs.Num(); iCB++ ) { FxCBuffer& cbuffer = shader->localCBs[ iCB ]; if( !cbuffer.backingStore.data.Num() ) { continue; } int uniformIndex = FindIndexByName( cbuffer.uniforms, name ); if( uniformIndex != -1 ) { uniform.id = (iCB << 12U) | uniformIndex; // 4 upper bits = UBO slot break; } } return uniform; }
DWORD GetProcedureAddress(HANDLE hProcess, DWORD ba, const char* module_name, const char *procedureName) { IMAGE_DOS_HEADER dosHdr; IMAGE_NT_HEADERS ntHdr; IMAGE_EXPORT_DIRECTORY exports; BOOL status; ZeroMemory(&dosHdr, sizeof(IMAGE_DOS_HEADER)); ZeroMemory(&ntHdr, sizeof(IMAGE_NT_HEADERS)); ZeroMemory(&exports, sizeof(IMAGE_EXPORT_DIRECTORY)); status = ReadProcessMemory( hProcess, (LPVOID) ba, &dosHdr, sizeof(dosHdr), NULL ); if (!status) { printf("ReadProcessMemory failed\n"); return 0; } if (dosHdr.e_magic != IMAGE_DOS_SIGNATURE) { printf("Invalid DOS header\n"); return 0; } status = ReadProcessMemory( hProcess, (LPVOID) (ba + dosHdr.e_lfanew), &ntHdr, sizeof(ntHdr), NULL ); if (!status) { printf("ReadProcessMemory failed: 0x%x\n", GetLastError()); return 0; } else if (ntHdr.Signature != IMAGE_NT_SIGNATURE) { printf("Invalid NT signature\n"); return 0; } // Read export section offset DWORD export_offset = ntHdr.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; status = ReadProcessMemory( hProcess, (LPVOID) (ba + export_offset), &exports, sizeof(exports), NULL ); if (!status) { printf("Failed to ReadProcessMemory: %x\n", GetLastError()); return 0; } // Verify that this library is required dll char *dllNameBuf = (char *) (ba + exports.Name); printf("DLL name: %s\n", dllNameBuf); if (strstr(module_name, dllNameBuf) == NULL) { return 0; } DWORD index = FindIndexByName(hProcess, ba, exports.AddressOfNames, exports.NumberOfFunctions, procedureName); if (index < 0) { printf("Failed to get function name index\n"); return 0; } else { printf("Index of %s: %d\n", procedureName, index); } WORD funcIndex = -1; status = ReadProcessMemory( hProcess, (LPVOID) (ba + exports.AddressOfNameOrdinals + index * sizeof(WORD)), &funcIndex, sizeof(funcIndex), NULL ); if (!status) { printf("Failed to ReadProcessMemory: %x\n", GetLastError()); return 0; } if ((funcIndex < 0) || (funcIndex >= exports.NumberOfFunctions)) { return 0; } DWORD funcRVA; status = ReadProcessMemory( hProcess, (LPVOID) (ba + exports.AddressOfFunctions + funcIndex * sizeof(DWORD)), &funcRVA, sizeof(funcRVA), NULL ); if (!status) { printf("Failed to ReadProcessMemory: %x\n", GetLastError()); return 0; } printf("Address Of %s: 0x%08x\n", procedureName, (ba + funcRVA)); return (ba + funcRVA); }