본문 바로가기

WINAPI

OleLoadPicture 를 이용한 JPG GIF BMP 로딩하여 HBITMAP 리턴하기 HBITMAPLoadImageFromFile(LPCTSTR szFileName) { HANDLEhFile= INVALID_HANDLE_VALUE; LPVOIDpvData= NULL; HGLOBAL hGlobal= NULL; LPPICTURE pPicture; try { HRESULT hr; DWORDdwFileSize; // 파일 열기 hFile = CreateFile(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); // 파일이 없을 경우 if(hFile == INVALID_HANDLE_VALUE) { TRACE("GetBitmapFromFile() File Open Error"); throw -1; } // 파일 크기 얻기 dwFileSize .. 더보기
Windows XP 서비스팩 2 이상의 어플리케이션 방어벽 등록 ifndef tstring #ifdef _UNICODE #define tstringstd::wstring #else #define tstringstd::string #endif #endif namespace cpueblo { HKEY RegOpen(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS) { HKEY hKey = NULL; LONG lRes = RegOpenKeyEx(hKeyParent, lpszKeyName, 0, samDesired, &hKey); if (lRes == ERROR_SUCCESS) { return hKey; } return NULL; } LONG RegSetValue(HKEY m_hKey, LPC.. 더보기
동기화 방법 종류와 특징 1. 크리티컬 섹션(Critical Section)이란? - 유저레벨 어플리케이션 작성 시 가장 간단하게 상요할 수 있는 방법이다. - 유저레벨의 동기화 방법 중 유일하게 커널 객체를사용하지 않으며 그 내부 구조가 단순하기 때문에 동기화 처리를 하는 데 있어서 속도가 빠르다는 장점이 있으며 동일한 프로세스내에서만 사용할 수 있다는 제약이 있다. - 크리티컬 섹션은 커널 객체를 사용하지 않기 때문에 핸들을 사용하지 않고 대신 CRITICAL_SECTION라는 타입을 정의하여 사용하게 되며, 아래 4가지 Win32 API를 사용하여 동기화를 수행하게 된다. ◦VOID InitializeCriticalSection(LRCRITICAL_SECTION IpCriticalSection); ◦VOID DeleteCr.. 더보기
듀얼 모니터 사용시 LPARAM메세지로 마우스 좌표 받아 오기 듀얼모니터를 사용하는 경우 윈도우나 마우스의 좌표가 음수(-)값이 나올 수 있다. 디스플레이 설정에서 우측의 모니터를 Primary모니터로 잡는 경우, 우측 모니터의 좌 상단이 (0,0)좌표가 되며, 왼쪽 모니터의 X좌표는 음수 값을 갖게 된다. 마우스나 윈도우의 좌표를 LPARAM의 전달하는 메시지의 경우, 보통 HIWORD(lParam), LOWORD(lParam)를 사용해서 좌표를 파싱하게 되는데 HIWORD()나 LOWORD() 매크로의 경우, WORD값 즉 양수만을 리턴 하므로 정상적인 좌표가 계산되지 않는다. 이경우, HIWORD() 대신 GET_X_LPARAM() LOWORD() 대신 GET_Y_LPARAM() 을 사용하면 정상적인 좌표값을 얻울 수 있다. GET_X_LPARAM()과 GET.. 더보기
모니터 제어 함수 절전모드/ 전원끄기 / 전원키기 , 해상도변경 더보기
서비스 안전모드에서 실행 일단 안전모드에서 프로그램이 동작하게 하려면 가장 좋은 것이 NT Service를 만드는 것입니다. 그런 다음 해당 서비스를 안전모드에서도 동작할 수 있도록 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal 여기에 등록하구요 그리고 현재 서비스가 SafeMode인지 Normal모드인지 체크하는 방법은 GetSystemMetrics의 SM_CLEANBOOT로 확인 하시면 됩니다. 더보기
정적 링크라이브러리(Static Link Library)와 동적 링크라이브러리(Dynamic Link Library) 정적 링크라이브러리(Static Link Library)와 동적 링크라이브러리(Dynamic Link Library) -정적링크라이브러리- 프로그램에서 특정 함수를 사용할려구 할 때 라이브러리 파일을 project-->setting-->Link-->Object/library modules에 추가를 해주면 해당함수에 대한 기능이 구현된 부분이 실행파일에 덧붙여 지는 것이다. #pragma comment(lib, "opengl32.lib")이렇게 써주는 것두 같은 방법이다. -동적링크라이브러리- dll파일이 독립적으로 실행파일 밖에서 존재하다가 필요시에만 링크되는 형태 1.메모리와 하드디스크를 절약할 수 있다. 2.프로그램 실행속도가 빨라질 수 있다. 3.프로그램이 모듈화 됩니다. 이런 차이가 있다. 그리고.. 더보기
Windows XP에서의 OpenProcess 에러 Windows XP에서의 OpenProcess 에러 OpenProcess()를 Windows 7 환경에서 컴파일한 후에, Windows XP에서 실행시켰더니, Windows 7에서 잘 돌아가는 프로그램이 XP에서는 OpenProcess()에서 NULL을 리턴해 버리네요 구글링을 해보니, 아래와 같은 버그(?)가 있나 봅니다. 결론 먼저 쓰자면, 첫번째 파라미터로 넘겨주는 access 권한을 PROCESS_ALL_ACCESS로 넘기면 안됩니다. msdn에서 OpenProcess의 프로토타입을 보면 아래와 같습니다.HANDLE WINAPI OpenProcess( __in DWORD dwDesiredAccess, __in BOOL bInheritHandle, __in DWORD dwProcessId ); 첫번.. 더보기
리소스 dll 만들기 from : http://msdn2.microsoft.com/ko-kr/library/24b2tcy0(VS.80).aspx 리소스 전용 DLL은 아이콘, 비트맵, 문자열 및 대화 상자 등의 리소스만 들어 있는 DLL입니다. 리소스 전용 DLL을 사용하면 여러 프로그램 간에 동일한 리소스 집합을 쉽게 공유할 수 있습니다. 여러 언어로 지역화된 리소스가 있는 응용 프로그램을 제공하는 것도 좋은 방법입니다(MFC 응용 프로그램의 지역화된 리소스: 위성 DLL 참조). 리소스 전용 DLL을 만들려면 새로운 Win32 DLL(비 MFC) 프로젝트를 만든 다음 이 프로젝트에 리소스를 추가합니다. 새 프로젝트 대화 상자에서 Win32 프로젝트를 선택한 다음 Win32 프로젝트 마법사에서 DLL 프로젝트 형식을 지정합.. 더보기
프로그램 간단히 실행 WinExec() WinExec("폴더 경로", SW_SHOWNORMAL); 더보기
유니코드 멀티바이트코드 변환 /////////////////////////////////////////// Wide Char 를 MultiByte로 바꾸는 방법 WCHAR wstrTxt[511] = L"Test"; char strTxt[511] = ""; WideCharToMultiByte(CP_ACP, 0, wstrTxt, -1, strTxt, 511, NULL, NULL); strTxt[510] = 0; /////////////////////////////////////////// Multi Byte를 Wide Char 로 바꾸는 방법 char strMulTxt[511] = L"Test2"; WCHAR wstrWTxt[511] = ""; MultiBytetoWideChar(CP_ACP, 0, strMulTxt, -1, wstrW.. 더보기
win32 api 디버깅 하는법 OutputDebugString( _T("Test Output Debug\n")); 이와 같이 하면 Debug 창에 출력을 할 수 있다. 그런데 가끔 OutputDebugStr( _T("Test Output Debug\n")); 이와 같이 사용하는 코드를 보게 되는데. 일반적으로 이코드는 컴파일 시 오류가 뜬다. 실제적으로 OutputDebugStr(..) 은 mmsystem.h 에 #if (WINVER 더보기
오토제작!! 매크로제작 이러한 자동입력 기능은 이미 win API함수로 만들어져 있다. 보안 업체는 이러한 API함수가 작동되지 않게 하였기 때문에 엔프로텍터나, 게임가드 등과같은 보안을 사용하는 프로그램의 오토제작을 위해서는 내장 API를 쓸수 없고(써도 되지만 동작하지 않는다) device driver로 새로 만들어야 된다. 물론 기본적인 device driver도 보안업체에서 이미 막아두었고 몇가지 우회를 통해서 만들어야 된다. device driver는 범위를 벗어나기 때문에 설명은 생략하고... API에는 다음과 같은 두가지 함수가 자동 입력기능을 담당하여 준다. 함수에 대한 설명은 msdn library를 참조하기 바란다. 설명은 생략하겠다. VOID WINAPI keybd_event( __in BYTE bVk, _.. 더보기
원도우핸들 -> 프로세스아이디 프로세스아이디 -> 원도우핸들 //---------------------------------------------- // 윈도우 핸들로 프로세스 아이디 얻기 //---------------------------------------------- ULONG ProcIDFromWnd(HWND hwnd) { ULONG idProc; GetWindowThreadProcessId( hwnd, &idProc ); return idProc; } //---------------------------------------------- // 프로세스 아이디로 윈도우 핸들 얻기 //---------------------------------------------- HWND GetWinHandle(ULONG pid) { HWND tempHwnd = Fi.. 더보기
원도우 기본 자료형 정보 #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef FLOAT *PFLOAT; typedef BOOL near *PBOOL; typedef BOOL far *LPBOOL; typedef BYTE near *PBYTE; typedef BYTE far *LPBYTE; typedef int near *P.. 더보기
윈도우가 32비트인지 64비트인지 확인 할 수 있는 함수 다른걸 찾다가 우연히 32비트인지 64비트인지 등 CPU에 대한 정보를 얻을 수 있는 함수를 보게되어 올립니다. 요새 점점 64비트쪽을 사용하시는 분들도 조금씩조금씩 생기고 있고, 관심도 생기고 있는 것 같은데 막상 딱 구분해보려하니 그런걸 해주는 함수가 있나 살짝 멍했는데..이런 함수가 있었네요.. 아래 API 함수를 사용하면 됩니다. void GetSystemInfo(LPSYSTEM_INFO lpSystemInfo); SYSTEM_INFO 구조체의 wProcessorArchitecture 멤버를 통해서 아래와 같은 정보를 구분 할 수 있습니다. PROCESSOR_ARCHITECTURE_AMD64 : x64 (AMD 또는 Intel) PROCESSOR_ARCHITECTURE_IA64 : Intel It.. 더보기
모든 아이피주소 알아내는 법 컴퓨터에 사용중인 모든 아이피주소 알아내는법 랜카드 2장일경우 필요하겠죠!! PIP_ADAPTER_INFO m_pInfo; ULONG m_len; GetAdaptersInfo(m_pInfo, &m_len); PIP_ADDR_STRING pAddressList = &(m_pInfo->IpAddressList); m_IP = _T(""); do { m_IP += pAddressList->IpAddress.String; pAddressList = pAddressList->Next; if( pAddressList != NULL) m_IP += _T("\r\n"); } while( pAddressList != NULL); 새로고친 방법!!! #include #include #pragma comment(lib, ".. 더보기
운영체제 버전 구하기 VerifyVersion과 GetVersionEx함수를 사용하여 정확한 OS 종류를 판단 BOOL WINAPI IsWin95() // 윈도우 95 BOOL WINAPI IsWin95OSR2() // 윈도우 95 OSR2 BOOL WINAPI IsWin98() // 윈도우 98 BOOL WINAPI IsWin98SE() // 윈도우 98 SE BOOL WINAPI IsWinME() // 윈도우 ME BOOL WINAPI IsWin9X() // 모든 윈도우 9x 시스템 BOOL WINAPI IsWinNT4() // 윈도우 NT4 BOOL WINAPI IsWin2K() // 윈도우 2000 BOOL WINAPI IsWinXP() // 윈도우 XP BOOL WINAPI IsWinNET() // 윈도우 .Net .. 더보기
visualc++lecture&tip 출처 : http://cafe.naver.com/windev ^^ 6.0에서 보면 좋은정보인거 같아서 이렇게 올려 펌질했습니다^^.. 훌터 보니깐 대부분 api내용이더군요^^ 문제 된다면 댓글 남겨주세요. 자삭 하겠습니다. 더보기
하이재킹 취약점 보안권고 2269637 요약 이 업데이트에서는 사용자가 DLL 검색 경로 알고리즘을 제어할 수 있도록 하는 새로운 레지스트리 항목 CWDIllegalInDllSearch를... 이 업데이트에서는 사용자가 DLL 검색 경로 알고리즘을 제어할 수 있도록 하는 새로운 레지스트리 항목 CWDIllegalInDllSearch를 소개합니다. DLL 검색 경로 알고리즘은 정규화된 경로를 지정하지 않고 DLL을 로드할 때 LoadLibrary API 및 LoadLibraryEx API에서 사용됩니다. 이 업데이트를 통해 관리자는 시스템 단위 또는 응용 프로그램별로 다음과 같은 항목을 정의할 수 있습니다. 라이브러리 검색 경로에서 현재 작업 디렉터리 제거. 응용 프로그램이 WebDAV 위치에서 라이브러리를 로드하지 못하도록 방지. 응용 프로그.. 더보기
Windows7 UAC Level 구분 Windows7 UAC는 Vista UAC(toggle mode)와는 달리 4단계의 UAC 레벨로 나누어져있다 그동안 Vista가 UAC 때문에 사용자한테 많은 욕(?)을 먹었다고 한다. 여러 feedback을 검토하여 Windows7 에서는 UAC 정책이 약간 달라졌다. 내가 봤을땐, 개발자 측면보단 역시나 사용자 편의성에 많이 초점이 간듯하다;; 개발자측면에서 Vista 때 보다 세분화된 UAC레벨을 알아야 필요성이 있기 때문에 아래 표는 오늘 Windows7 (build7000기준) 에서 각 UAC레벨에 따른 Registry 변화를 디버깅(ㅡ.ㅜ) 한 결과이다. Windows 7 UAC Level HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\S.. 더보기
인터넷 URL로 파일다운!! LiveUpdator 모듈을 개발하면서 특정 URL(파일)을 다운로드할 필요가 생겨 WinInet 라이브러리를 사용하여 InternetOpen() 함수와 같은 High-Level의 함수를 사용하였다. 허나,,, 단순히 파일만 다운로드하는거라면,,,(다운로드 기능에 충실) URLDownloadToFile() 같은 MORE High-Level함수를 사용해도 충분하다는걸 알았다. 함수 prototype은 아래와 같다. HRESULT URLDownloadToFile( LPUNKNOWN pCaller, LPCTSTR szURL,// 다운로드할 URL LPCTSTR szFileName,// Local에 저장할 경로명 DWORD dwReserved,// 0 LPBINDSTATUSCALLBACK lpfnCB// IBi.. 더보기
PumpMessage를 이용한 Wait void Wait(int DelayTime) { LONG cnt = GetTickCount(); while(1) { MSG msg; while(1) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else break; } Sleep(1); if ((LONG)(GetTickCount() - cnt) > DelayTime) return; } } 더보기
shell api path 변환 Shell API 를 이용하여 Path관련 작업을 보다 손쉽게... 총으로 전쟁하다 전투기 한대 산듯한 느낌이다 ^^ 함 수 명 인 자 결 과 PathAddBackslash c:\path1 c:\path1\ PathBuildRoot 0 A:\ PathCanonicalize c:\path1\..\.\path1 c:\path1 PathCompactPath c:\path1\path2\path3\file.txt c:\path1\...\file.txt PathFileExists c:\path1\file.txt 파일의존재유무[T/F] PathFindFileName c:\path1\path2\file.txt file.txt PathIsDirectory c:\path1\path2 디렉토리유무[T/F] PathIsfil.. 더보기
프로세스 검색하여 정보 취득 #include using namespace std; #include #include int main(){ HANDLE hSnap; PROCESSENTRY32 pe; BOOL bFound = false; vector pidVector; hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0); if(hSnap == (HANDLE)-1) return 0; pe.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnap, &pe)) { do { if (strstr((char *)pe.szExeFile, "iexplore.exe")) { pidVector.push_back(pe); bFound = true; } } whi.. 더보기
특정 프로세스가 사용 중인 파일 목록 조회하는 방법 (소스코드) 더보기
NtQuerySystemInformation 디버그 모드 체크!! 모게임보안제품에서 예전에 디버그모드로 부팅한 상태로 게임을 실행시키면 재부팅되게끔 하는 안티디버깅 루틴이 있었습니다. 어떻게 디버그모드로 부팅했는지 판단하나 궁금했었는데 "Reversing Secrets of Reverse Engineering"이라는 책에 나오는군요. 이책에 따르면, 이 방법은 Softice디버거에는 적용할 수 없으며 SoftIce는 해당 드라이버를 open해봐서 판단하라고 합니다. //Summary:NtQuerySystemInformation함수를 이용하여 디버그모드로 부팅했는지 감지 //Target:Windbg //Tested:WinXP //Reference:http://www.team509.com/download/SecretsOfRE_Chap10_1.pdf // BOOL __std.. 더보기
NtQuerySystemInformation ● NtQuerySystemInformation 는 지정된 시스템 정보(첫번째 인자)를 가져오는 함수이다. 원형은 아래와 같다. NTSTATUS WINAPI NtQuerySystemInformation( __in SYSTEM_INFORMATION_CLASS SystemInformationClass, __inout PVOID SystemInformation, __in ULONG SystemInformationLength, __out_opt PULONG ReturnLength ); ※ 인자 설명 1) SystemInformationClass - 시스템 정보를 지정하는 인자. 구성값은 아래와 같다. typedef enum _SYSTEM_INFORMATION_CLASS { SystemBasicInformatio.. 더보기
dll 로딩과 해체!! [명시적 로딩] Dll의 로딩여부가 링크 시에 결정되는 것이 아니라. 유저가 원할 때 해당 DLL을 로드하여 원하는 함수를 사용할 수 있게 하는 메커니즘을 의미한다. DLL명시적 로딩은 유저에게 상당히 유연한 매커니즘을 제공한다. 명시적 로딩은 유저가 원할때 언제나 해당 DLL을 로드하여 사용한 후 필요가 없으면 언로드할 수 있다 사실 이러한 명시적 로딩이 소위 요즘 이야기되고 있는 컴포넌트 기반 프로그래밍의 출발이라고 할 수 있을것이다. COM 모델로 와서야 컴포넌트 기반의 프로그래밍이 일반화되었고, 이제 MS는 .NET기반의 프레임워크를 제공함으로써 완전한 컴포넌트 기반 환경을 제공하고 있다. COM 모델의 핵심이라고 한다면 그것을 인터페이스기반 프로그래밍으로서 설계와 구현의 분리에 모든 것이 담겨 .. 더보기
cpu모니터링 콘솔 프로그램!! 네이버 카페에서 펌한건데!! 정확히 어디 인지 기억이 않나네요^^.. 참고 하려고 퍼왔습니다! 문제 되면 말씀주세요 삭제하게^^ #include #include #include #define MAXCPU 32 typedef NTSTATUS (WINAPI *NTQSI)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG); void setcolor(int color, int bgcolor) { color &= 0xf; bgcolor &= 0xf; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), (bgcolor = 0; i--) { index = graph->index; gotoxy(x, y + 10 - i); setcol.. 더보기