CreateProcessAsUser, вызов функции dll
С CreateProcessAsUser я могу вызвать файл.exe где-нибудь на жестком диске:
CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine,
ref SECURITY_ATTRIBUTES lpProcessAttributes, ref SECURITY_ATTRIBUTES lpThreadAttributes,
bool bInheritHandle, Int32 dwCreationFlags, IntPtr lpEnvrionment,
string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo,
ref PROCESS_INFORMATION lpProcessInformation);
Каждый отдельный пример, который я нашел в сети, использует аргумент lpCommandLine для вызова программы. Я хотел бы вызвать функцию в DLL. Кто-нибудь знает возможно ли это? Было бы неплохо иметь такой пример...
Спасибо!
2 ответа
Вы не можете напрямую вызывать DLL как другого пользователя, так как пользователь / уровень выполнения зависит от процесса, а не от DLL или потока. Вы должны начать новый процесс, который затем вызывает DLL. Это метод, используемый повышением COM и т. Д. Если DLL имеет правильную сигнатуру, вы можете попробовать вызвать ее с помощью rundll32.exe
,
Я не думаю, что это возможно с этой функцией. Стандартный способ вызова метода в DLL - это LoadLibrary
а также GetProcAddress
методы, как в этом примере:
(Взято из MSDN)
// A simple program that uses LoadLibrary and
// GetProcAddress to access myPuts from Myputs.dll.
#include <windows.h>
#include <stdio.h>
typedef int (__cdecl *MYPROC)(LPWSTR);
int main( void )
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
// Get a handle to the DLL module.
hinstLib = LoadLibrary(TEXT("MyPuts.dll"));
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");
// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n");
}
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");
return 0;
}