Ctrl-Alt-Delete를 누르면 나타나는 작업관리자 목록에서 원하는 프로그램을 감추는 방법을 소개하겠다. 사실 방법은 매우 간단하지만 잘 알려져 있지 않은듯하다.
Win32 API 중 RegisterServiceProcess()는 커널함수가 있다. 이 함수는 MSDN에서도 문서화되어 있는 함수이지만 일반 API 함수를 사용하듯 호출할 수 없다. 아마 특별한 이유에서 헤더파일에 프로토타입을 빼놓은 듯 한데, GetProcAddress() 함수와 함수포인터를 사용해서 호출할 수 있다. 아래에 리스트된 코드를 보자.
typedef DWORD (WINAPI *LPREGSRVPROC)(DWORD, DWORD);
void RegisterServiceProcess(DWORD dwProcessId, DWORD dwType)
{
HMODULE hMod = GetModuleHandle("kernel32.dll");
if(hMod)
{
LPREGSRVPROC pfn = (LPREGSRVPROC)GetProcAddress (
hMod, "RegisterServiceProcess");
if(NULL != pfn) pfn(dwProcessId, dwType);
}
}
dwProcessId : 프로세스 식별자
dwType : 1이면 프로세스를 서비스모드로 등록(작업관리자에 나타나지 않음), 0이면 서비스모드 해제
Example Borland c code:
//--------------HiddenApp.cpp--------------
#include
#pragma hdrstop
USERES("HiddenApp.res");
USEFORM("Unit1.cpp",Form1);
typedef DWORD (WINAPI *TRegisterServiceProcess)(DWORD,DWORD);
bool registered=false;
//////////////////////////////////////////////////////////////////////////
void __fastcall reg(bool which) //true=register, false=unregister
{
HMODULE hmod;
TRegisterServiceProcess pReg;
hmod = LoadLibrary("kernel32.dll");
if (!hmod) return;
(FARPROC)pReg = (FARPROC)::GetProcAddress(hmod,"RegisterServiceProcess");
if (!pReg) {FreeLibrary(hmod); return;}
else
{
if (which)
pReg(0,1); //unregister our process
else
pReg(0,0);
}
registered = true;
FreeLibrary(hmod);
}
//////////////////////////////////////////////////////////////////////////
WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
try
{
reg(true);
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
if (registered) reg(false);
return 0;
}
//--------------eof----------------------------
'개발지식창고 > Win32 API' 카테고리의 다른 글
리소스 풀어 헤치기 (0) | 2012.01.13 |
---|---|
특수 폴더 경로 알기 (SHGetSpecialFolderPath) (0) | 2012.01.12 |
64비트 기반 프로그래밍 (0) | 2011.03.20 |
SDK로 구현된 WinMain.cpp 파일의 구성 (0) | 2010.07.30 |