na Windows, kilka argumenty są przekazywane do konstruktora DllMain:Linux: Jak uzyskać pełną nazwę obiektu współdzielonego, który został załadowany z konstruktora?
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
);
Od hinstDLL mogę uzyskać pełną nazwę pliku samego DLL przy użyciu GetModuleFileName():
LPTSTR str = new TCHAR[256];
int libNameLength = GetModuleFileName(hinstDLL, str, 256);
delete[] str;
W przykładzie powyżej, str zawiera teraz pełną nazwę załadowanej biblioteki DLL, np. C: \ Windows \ System32 \ MyFile.dll.
na Linuksie, żadne argumenty są przekazywane do konstruktora obiektu dzielonego:
void `__attribute__` ((constructor)) on_load(void);
Jak mogę uzyskać pełną nazwę pliku DLL w tym przypadku? Dodatkowy kredyt, jeśli twoje rozwiązanie działa również na Macu. :-)
Nie wiem, czy jest dobra droga. Moje pytanie w takich sytuacjach brzmi "Dlaczego chcesz to wiedzieć?". Odzyskując poziom, możesz znaleźć ścieżkę do prawdziwego celu, nie robiąc kroku, który aktualnie Cię blokuje. – Omnifarious
Dobre pytanie. Chcę wiedzieć, ponieważ opracowuję moduł CSP i moduł PKCS # 11 (pliki DLL), które muszą zweryfikować swoją integralność po wczytaniu. Oba pliki DLL są ładowane przez system operacyjny, więc moim punktem wejścia jest konstruktor. Obecnie najlepszym pomysłem na weryfikację integralności pliku DLL jest obliczenie skrótu pliku DLL w konstruktorze, a następnie wysłanie tego skrótu do centralnego serwera, który może zweryfikować poprawność hasza. Jednak potrzebuję nazwy pliku DLL, aby móc obliczyć hash. –