GetModuleFileName是如何实现的?现在要在另外一个嵌入式操作系统上使用类似GetModuleFileName的功能,但是那个系统中没有GetModuleFileName API函数,想问一下,windows中这个函数的实现,然后再现在的这个操作系统中模拟一下。另外,如果要模拟实现很麻烦,那么请问,有没有办法作如下事情:有一个函数Fun(),在这个函数中想取得定义这个函数的Lib的二进制数据,那么我是否可以根据这个函数的“函数入口地址”在内存的代码段中取道Lib的二进制数据。我的理由是,既然Fun函数被调用了,那么定义Fun函数的Lib也肯定被加载到内存代码段中了,那么我自然可以在内存的代码段中找到Lib的二进制数据了。不知道我上述的理解是否正确,请高手指点呀。

解决方案 »

  1.   

    没看过该API函数的源代码,难道是传入的命令行参数。默认的第一个就是当前路径!
      

  2.   

    嵌入式操作系统?我没记错的话,GetModuleFileName调用了ZwXXX的一些内核函数进行Ob对象查询的
      

  3.   

    三楼说的方法就行啊
    在GetCommandLine里面取
      

  4.   

    汇编好的话
    可以把这个API给逆了。
      

  5.   


    GetCommandLine是什么呀,可以在ThreadX操作系统里用吗?
      

  6.   

    DWORD
    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;
    }