본문 바로가기
반응형

프로그래밍/C·C++29

VEH (Vectored Exception Handling) 참조1 : http://msdn.microsoft.com/en-us/library/ms681420(v=VS.85).aspx 참조2 : http://blogs.msdn.com/b/zhanli/archive/2010/06/25/c-tips-addvectoredexceptionhandler-addvectoredcontinuehandler-and-setunhandledexceptionfilter.aspx VEH는 SEH의 확장된 개념으로써, 프레임 기반이 아니기 때문에 어떠한 곳에서든지 핸들러를 추가할 수 있다.  1.SetUnhandledExceptionFilter LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( __in LPTOP_LEVE.. 2011. 8. 15.
SEH(Structured Exception Handling) 참조 : http://msdn.microsoft.com/en-us/library/swezty51(v=VS.71).aspx 비동기적으로 아무 때나 발생가능한 인터럽트와 달리 실행 중인 프로그램의 직접적인 실행 결과로 발생하는 예외를 처리하기위하여 윈도우는 어플리케이션이 예외 발생시 제어를 받을 수 있도록 SEH를 사용한다. SEH는 시스템 메커니즘으로서 프로그램 언어 한정적인 것이 아니라 것에 유의해야한다. ※여기에서는 C를 기준으로 사용법을 기술한다. SEH는 기능적 특성에 따라 Termination Handler와 Exception Handler 두 가지로 나뉜다.  1.Termination Handler Termination Handler는 __try와 __finally 키워드로 구성되며 __try.. 2011. 8. 15.
strrstr 함수 구현 (문자열 역순 탐색 함수) -strstr 함수와 유사하게 문자열을 탐색하나 역순으로 탐색한다. #include #include char* strrstr(char* str,char* ptn){ unsigned int ptnlen=0; unsigned int i=0; unsigned int j=0; char* offset=-1; //패턴 문자열 길이 획득 (인덱스로 사용하기 위해 1 감소) ptnlen=strlen(ptn)-1; //문자열의 오른쪽부터 비교 시작 for(i=strlen(str)-1;i != 0;i--){ //문자열의 현재 위치 문자가 패턴 문자열의 마지막 문자와 일치 하는지 확인 if(str[i] == ptn[ptnlen]){ //패턴 문자열이 1 글자이면 오프셋 값 저장하고 리턴 if(ptnlen == 0){ off.. 2011. 7. 20.
프로세스 리스트 얻기 -프로세스 리스트를 얻어와 프로세스 리스트를 구조체에 저장한다. -PLIST : 프로세스 경로, PID 값을 가지는 간단한 이중 연결리스트 구조체 -DeleteProcessList : 프로세스 리스트를 제거한다. -GetProcessList_TI : TlHelp32를 이용한 프로세스 리스트 획득 함수 (히든 프로세스 탐지 불가능) -GetProcessList_BF : Psapi를 이용한 프로세스 리스트 획득 함수 (Brute Force식 PID 탐색을 통한 히득 프로세스 탐지 가능) #include #include #include #define BUFSIZE 512 /** 프로세스 리스트 저장 구조체 **/ struct _PLIST{ char path[BUFSIZE]; int pid; struct _PL.. 2011. 7. 4.
프로세스 제거하기 -인자로 전달된 PID를 가지는 프로세스를 종료한다. #include int KillProcess(int pid){ HANDLE hProc; hProc=OpenProcess(PROCESS_TERMINATE,FALSE,pid); if(!hProc){ return GetLastError(); } TerminateProcess(hProc,0); CloseHandle(hProc); return 0; } 2011. 7. 4.
프로세스 생성하기 -인자로 전달된 파일을 실행시킨다. #include void createPS(char* path){ STARTUPINFO si; PROCESS_INFORMATION pi; int state=0; si.cb=sizeof(STARTUPINFO); si.lpReserved=NULL; si.lpReserved2=NULL; si.cbReserved2=NULL; si.lpDesktop=NULL; si.lpTitle=NULL; si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; si.dwX=0; si.dwY=0; si.dwFillAttribute=0; si.wShowWindow=SW_HIDE; state=CreateProcess(NULL,path,NULL,NULL,TRUE.. 2011. 7. 4.
레지스트리 삭제하기 -RegDeleteValue로 레지스트리 값 제거가 가능하고 RegDeleteKey로 레지스트리 키 제거가 가능하다. #include int main(){ HKEY hkey; int result=0; RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&hkey); //레지스트리 값 삭제 if(RegDeleteValue(hkey,"StartUPProgram") == ERROR_SUCCESS){ result++; } //레지스트리 키 삭제 if(RegDeleteKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Minimal\\SVCWI.. 2011. 7. 4.
레지스트리 값 출력하기 -인자로 전달된 레지스트리 키의 하위 키와 값들을 출력한다. ex:)PrintReg(HKEY_LOCAL_MACHINE,"\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 하위키와 값들을 출력한다. #include #include #define MAX_KEY_SIZE 512 #define MAX_VALUE_SIZE 512 BOOL PrintReg(HKEY root,char* key){ HKEY hkey; TCHAR key[MAX_KEY_SIZE]=""; TCHAR value[MAX_VALUE_SIZE]=""; DWORD keysize=MAX.. 2011. 7. 4.
윈도우 서비스 제거하기 -인자로 전달된 서비스명의 윈도우 서비스를 제거한다. #include #define BUFSIZE 512 void RemoveService(char* sc_name){ SC_HANDLE hManager; SC_HANDLE hService; SERVICE_STATUS sStat; char path[BUFSIZE]; hManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); hService=OpenService(hManager,sc_name,SERVICE_ALL_ACCESS); if(hService){ //서비스 실행 중지 ControlService(hService,SERVICE_CONTROL_STOP,&sStat); while(QueryServiceStatus(h.. 2011. 7. 4.
파일 탐색하기 -인자로 전달된 디렉토리 경로로부터 파일을 탐색한다. ex:)SearchFile("C:\\*.*"); //C드라이브의 모든 파일을 탐색한다. #include #include #include #define BUFSIZE 512 void SearchFile(char* pPath){ struct _finddatai64_t c_file; intptr_t hFile; char dirPath[BUFSIZE]; char tempPath[BUFSIZE]; int i; //디렉토리 경로명만 추출하는 작업(현재 경로명에서 *.* 제거) strncpy(dirPath,pPath,BUFSIZE-1); i=strlen(dirPath)-4; dirPath[i]=0; //파일 탐색 시작 hFile=_findfirsti64(pPath.. 2011. 7. 4.
호스트 IP 주소 얻기 -인자로 전달한 문자열 포인터에 호스트 IP 주소를 저장한다. #include #include void GetHostIP(char* ip){ WORD wVersionRequested; WSADATA wsaData; char name[255]; PHOSTENT hostinfo; wVersionRequested = MAKEWORD(2,0); if(WSAStartup(wVersionRequested,&wsaData) == 0){ if(gethostname(name,sizeof(name)) ==0){ if((hostinfo = gethostbyname(name)) != NULL){ strcpy(ip,inet_ntoa(*(struct in_addr*)*hostinfo->h_addr_list)); } } } WSA.. 2011. 7. 4.
파일 다운로드 하기 -인자로 전달받은 URL로부터 파일을 다운로드 받습니다. ex:)GetFile("http://localhost/file.exe","c:\\file.exe"); //http://localhost/file.exe 에서 파일을 다운받아 c:\file.exe에 저장 #include #include BOOL GetFile(char* url,char* dstPath){ HRESULT hr; hr=URLDownloadToFile(NULL,url,dstPath,0,NULL); if(hr == S_OK){ return TRUE; } return FALSE; } 2011. 7. 4.
시스템 드라이브 목록 얻기 -현재 시스템의 드라이브 목록을 얻습니다. #include #include int main(){ int cnt; int i; int drvType; char drvRoot[104]; char path[7]="A:/*.*"; //드라이브 목록을 불러옴 cnt=GetLogicalDriveStrings(104,drvRoot); for(i=0;i 2011. 7. 4.
운영체제 정보 얻기 -현재 실행중인 운영체제의 정보를 얻습니다. #include #include void printOSInfo(){ OSVERSIONINFO info; info.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&info); printf("Major : %d\n",info.dwMajorVersion); printf("Minor : %d\n",info.dwMinorVersion); printf("ServicePack : %s\n",info.szCSDVersion); } 2011. 7. 4.
콘솔 텍스트 출력하기 -콘솔의 원하는 위치에 텍스트를 출력합니다. ex:) printText("Hello World!!",3,DEFAULT,RIGHT); //오른쪽 정렬로 우측 3칸을 비우고 현재 라인에 문자열 출력 #include #include //텍스트 출력 정렬 #define LEFT -1 #define CENTER 0 #define RIGHT 1 //기본 좌표 #define DEFAULT -1 void printText(char* buffer,int x,int y,int align){ COORD cr; CONSOLE_SCREEN_BUFFER_INFO info; int width; //콘솔 너비 int height; //콘솔 높이 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPU.. 2011. 7. 4.
콘솔 창 숨기기 -현재 실행중인 콘솔 창을 보이지 않게 숨긴다. #include #define BUFSIZE 512 int main(){ HWND hwnd; char title[BUFSIZE]="My Title"; SetConsoleTitle(title); //타이틀 설정 hwnd=FindWindow(NULL,title); //타이틀에 해당하는 윈도우 핸들 얻기 ShowWindow(hwnd,SW_HIDE); //숨김 옵션 설정 return 0; } 2011. 7. 4.
파일 관련 API GetCurrentDirectory -현재 실행중인 파일의 경로를 리턴한다. GetModuleFileName -현재 실행중인 파일의 경로와 파일명을 리턴한다.(2번째 인자 이용) SetFilePointer(hfile,IDistanceToMove,IDistanceToMoveHigh,dwMoveMethod) -파일 포인터의 위치를 설정한다. ▶hfile : 파일 핸들러 ▶IDistanceToMove : 주소 지정 ▶IDistanceToMoveHigh : 64bit 주소 지정에 사용 ▶dwMoveMethod : 움직일 방향 (시작 지점) -FILE_BEGIN : 파일 시작 지점 (0) -FILE_CURRENT : 현재 포인터 위치 (1) -FILE_END : 파일 마지막 지점 (2) ReadFile(hFile.. 2011. 5. 10.
C에서 입력 버퍼를 비울 때 피해야할 방법 [강좌] C에서 입력 버퍼를 비울 때 피해야할 방법 (C언어를 배우자) |작성자 네가티브 #include int main(int argc, char *argv[]) { int d; while(1) { scanf("%d", &d); printf("%d\n", d); } return 0; } 실행해보시면 숫자를 입력할 시 그 숫자가 화면에 출력되는 형태로 무한 반복됨을 알 수 있습니다. 그런데, 여기에 문자를 입력하면 무한 루프에 빠지게 됩니다. 이걸 방지하고자 초보자들은 아래와 같은 코드를 작성하기도 합니다. #include int main(int argc, char *argv[]) { int d; while(1) { fflush(stdin); // 입력 버퍼를 비운다. scanf("%d", &d); pr.. 2010. 8. 11.
maze 싱글 소스 2010. 8. 11.
readn() & writen() 코드, unpipc.h 파일 unpipc.h 를 include 하고 사용한다. 일반 read()&write() 함수와 사용법은 같다. readn ssize_t readn(int fd, void *vptr, size_t n) { size_t nleft; ssize_t nread; char *ptr; ptr = vptr; nleft = n; while (nleft > 0) { if ( (nread = read(fd, ptr, nleft)) < 0) { if (errno == EINTR) nread = 0; /* and call read() again */ else return(-1); } else if (nread == 0) break; /* EOF */ nleft -= nread; ptr += nread; } return(n - nl.. 2010. 8. 11.
반응형

바로가기