Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}