GetModuleFileName是如何实现的?现在要在另外一个嵌入式操作系统上使用类似GetModuleFileName的功能,但是那个系统中没有GetModuleFileName API函数,想问一下,windows中这个函数的实现,然后再现在的这个操作系统中模拟一下。另外,如果要模拟实现很麻烦,那么请问,有没有办法作如下事情:有一个函数Fun(),在这个函数中想取得定义这个函数的Lib的二进制数据,那么我是否可以根据这个函数的“函数入口地址”在内存的代码段中取道Lib的二进制数据。我的理由是,既然Fun函数被调用了,那么定义Fun函数的Lib也肯定被加载到内存代码段中了,那么我自然可以在内存的代码段中找到Lib的二进制数据了。不知道我上述的理解是否正确,请高手指点呀。
在GetCommandLine里面取
可以把这个API给逆了。
GetCommandLine是什么呀,可以在ThreadX操作系统里用吗?
WINAPI
GetModuleFileNameW (
HINSTANCE hModule,
LPWSTR lpFilename,
DWORD nSize
)
{
UNICODE_STRING FileName;
PLIST_ENTRY ModuleListHead;
PLIST_ENTRY Entry;
PLDR_DATA_TABLE_ENTRY Module;
PPEB Peb;
ULONG Length = 0; Peb = NtCurrentPeb ();
RtlEnterCriticalSection (Peb->LoaderLock); if (hModule == NULL)
hModule = Peb->ImageBaseAddress; ModuleListHead = &Peb->Ldr->InLoadOrderModuleList;
Entry = ModuleListHead->Flink;
while (Entry != ModuleListHead)
{
Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); if (Module->DllBase == (PVOID)hModule)
{
Length = min(nSize, Module->FullDllName.Length / sizeof(WCHAR));
FileName.Length = 0;
FileName.MaximumLength = (USHORT) Length * sizeof(WCHAR);
FileName.Buffer = lpFilename; RtlCopyUnicodeString (&FileName,
&Module->FullDllName);
if (nSize < Length)
SetLastErrorByStatus (STATUS_BUFFER_TOO_SMALL);
else
lpFilename[Length] = L'\0'; RtlLeaveCriticalSection (Peb->LoaderLock); return Length;
} Entry = Entry->Flink;
} SetLastErrorByStatus (STATUS_DLL_NOT_FOUND);
RtlLeaveCriticalSection (Peb->LoaderLock); return 0;
}