StartService & SetHook & OpenFileMapping все вместе не работает :(
Делаю так:
Создаю сервис, в сервисе создаю МапФайл с именем "blabla", загружаю DLLку с хуком, при инициализации DLLки открываю МапФайл с тем же именем. Dllка в контексте сервиса работает. В любом другом контексте OpenFileMapping возвращает "отказано в доступе". Но если Хук запускаю не из сервиса, а из простой программы все работает нормально. Объясните где я туп?
//Начало HookDll.DLL
BOOL GetMap()
{
//Открывает МапФайл и если ошибка выводим сообщение об ошибке
hMapObject = OpenFileMapping(FILE_MAP_WRITE, TRUE, "blabla");
if(hMapObject == NULL){
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, lpMsgBuf, "Error", 0);
return FALSE;
}
}
//Старт DLL
BOOL WINAPI DllEntryPoint( HINSTANCE hinstDll, DWORD fdwRreason, LPVOID){
if(fdwRreason == DLL_PROCESS_ATTACH) GetMap();
}
//Функция Хука
ULONG WINAPI KeyboardProc(int code,WPARAM wParam,LPARAM lParam){return 0;}
//Конец HookDll.DLL
//Начало Service.exe
BOOL AddHook ()
{
//Создаем МапФайл в файле подкачки
hMapObject = CreateFileMapping(0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 256, "blabla");
Struct = (PVOID)MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//Загружаем DLLку и стартуем Хук
hLib = LoadLibrary("HookDll.dll");
KeybrdProc = (HOOKPROC)GetProcAddress(hLib, "KeyboardProc");
hHook = SetWindowsHookEx(WH_KEYBOARD, KeybrdProc, hLib, 0);
}
void MyServiceStart ()
{
//Инициализируем сервис
memset(&MyServiceStatus, 0, sizeof(MyServiceStatus))
MyServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
MyServiceStatus.dwWaitHint = 1;
MyServiceStatusHandle = RegisterServiceCtrlHandler(NPFServiceName, MyHandler);
SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus);
AddHook ();
whie(0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
//запускаем сервис
SERVICE_TABLE_ENTRY DispatchTable[] = {{TEXT("MyService"), MyServiceStart}, {NULL, NULL}};
StartServiceCtrlDispatcher( DispatchTable);
}
//Конец Service.exe
Заранее спасибо!
Цитата: barracuda
Помогите разобраться OpenFileMapping возвращает "отказано в доступе".
Похоже никто незнает...
а все оказалось очь просто... добавил сикьюрити и все заработало:
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.lpSecurityDescriptor = &sd;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
hMapObject = CreateFileMapping(h, &sa, PAGE_READWRITE, 0, size, Name);