Vista 에서 Process 의 Privilege 확인 Code
CODE2009. 7. 7. 12:16
#include#include typedef enum _TOKEN_ELEVATION_TYPE { TokenElevationTypeDefault = 1, TokenElevationTypeFull, TokenElevationTypeLimited } TOKEN_ELEVATION_TYPE; DWORD GetElevationType(HANDLE hProcess) { HANDLE hToken = NULL; DWORD dwElevType = 0; DWORD dwSize = 0; BOOL bResult = 0; bResult = OpenProcessToken(hProcess, TOKEN_QUERY, &hToken); if(bResult == 0) { //Err //GetLastError(); return 0; } bResult = GetTokenInformation(hToken, /*TokenElevationType*/(_TOKEN_INFORMATION_CLASS)18, &dwElevType, sizeof(dwElevType), &dwSize); if(bResult == 0) { //Err //GetLastError(); return 0; } if(hToken) CloseHandle(hToken); return dwElevType; } int main(int argc, char* argv[]) { DWORD dwElev = 0; dwElev = GetElevationType(GetCurrentProcess()); switch (dwElev) { case TokenElevationTypeDefault: printf("TokenElevationTypeDefault\n"); break; case TokenElevationTypeFull: printf("TokenElevationTypeFull\n"); break; case TokenElevationTypeLimited: printf("TokenElevationTypeLimited\n"); break; } return 0; }
BASE64 Encode/Decode
CODE2009. 6. 26. 14:00
#include#include #include static const char Base64_EM[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //!< Base64 인코드 테이블 static char Base64_DM[256] = {0,}; //!< Base64 디코드 테이블 /*! \brief Base64 초기화 함수 제공되는 다른 함수를 사용하기 이전에 선행 호출 \see */ void base64_Init() { for(int i = 0; i<256; i++) Base64_DM[i] = -1; for(int i = 0; i<64; i++) Base64_DM[Base64_EM[i]] = i; return; } /*! \brief Base64 Encode 함수 메모리의 내용을 문자열로 변환하여 주는 함수 \param[in] pInBuf 문자열로 바꿀 메모리의 포인터 \param[in] ulSize 문자열로 바꿀 메모리의 크기 \param[out] ppOutBuf 변환된 문자열을 받을 메모리 포인터이며, 내부에서 할당하여 반환하므로 사용이 끝나면 free 하여야 한다. \return 할당된 ppOutBuf 메모리의 크기 \see */ int base64_Encode(unsigned char *pInBuf, unsigned long ulSize, unsigned char **ppOutBuf) { unsigned char input[3] = {0,}; unsigned char output[4] = {0,}; unsigned long ulOutbufSize = 0; unsigned long ulOctaPosition = 0; unsigned long ulOctaSplit = 0; unsigned long ulHexaSplit = 0; unsigned char *pOctaBit = 0; unsigned char *pOctaBit_endof = 0; pOctaBit_endof = pInBuf + ulSize - 1; ulOutbufSize = (4 * (ulSize / 3)) + (ulSize % 3? 4 : 0) + 1; (*ppOutBuf) = (unsigned char*)malloc(ulOutbufSize); for (pOctaBit = pInBuf;pOctaBit <= pOctaBit_endof; ulOctaSplit++, pOctaBit++) { ulOctaPosition = ulOctaSplit % 3; input[ulOctaPosition] = *pOctaBit; if (ulOctaPosition == 2 || pOctaBit == pOctaBit_endof) { output[0] = ((input[0] & 0xFC) >> 2); output[1] = ((input[0] & 0x3) << 4) | ((input[1] & 0xF0) >> 4); output[2] = ((input[1] & 0xF) << 2) | ((input[2] & 0xC0) >> 6); output[3] = (input[2] & 0x3F); (*ppOutBuf)[ulHexaSplit++] = Base64_EM[output[0]]; (*ppOutBuf)[ulHexaSplit++] = Base64_EM[output[1]]; (*ppOutBuf)[ulHexaSplit++] = ulOctaPosition == 0? '_' : Base64_EM[output[2]]; (*ppOutBuf)[ulHexaSplit++] = ulOctaPosition < 2? '_' : Base64_EM[output[3]]; input[0] = input[1] = input[2] = 0; } } (*ppOutBuf)[ulHexaSplit] = '\0'; return ulOutbufSize; } /*! \brief Base64 Decode 함수 문자열을 원본 데이터로 변환하여 주는 함수 \param[in] pInBuf 변환할 문자열 \param[in] ulSize 복원할 사이즈, Encode시의 Return 값과 같다. \param[out] pOutBuf 복원 내용을 받을 메모리 포인터 \return 복원된 데이터의 사이즈 \see base64_Encode */ int base64_Decode(unsigned char *pInBuf, unsigned long ulSize, unsigned char *pOutBuf) { unsigned long ulOctaPosition = 0; unsigned long ulHexaPosition = 0; unsigned char* pOctaBit = 0; unsigned char cOctaBit = 0; char cHexaBit = 0; char cHexaBit_prev = 0; for ( pOctaBit = pInBuf; *pOctaBit != '\0'; ++pOctaBit ) { cHexaBit = Base64_DM[(int) *pOctaBit]; if ( cHexaBit != -1 ) { switch ( ulHexaPosition ) { case 0: ++ulHexaPosition; break; case 1: cOctaBit = ( ( cHexaBit_prev << 2 ) | ( ( cHexaBit & 0x30 ) >> 4 ) ); if ( ulOctaPosition < ulSize ) pOutBuf[ulOctaPosition++] = cOctaBit; ++ulHexaPosition; break; case 2: cOctaBit = ( ( ( cHexaBit_prev & 0xf ) << 4 ) | ( ( cHexaBit & 0x3c ) >> 2 ) ); if ( ulOctaPosition < ulSize ) pOutBuf[ulOctaPosition++] = cOctaBit; ++ulHexaPosition; break; case 3: cOctaBit = ( ( ( cHexaBit_prev & 0x03 ) << 6 ) | cHexaBit ); if ( ulOctaPosition < ulSize ) pOutBuf[ulOctaPosition++] = cOctaBit; ulHexaPosition = 0; break; } cHexaBit_prev = cHexaBit; } } return ulOctaPosition; }
MBCS <-> Unicode 간 변환 매크로
CODE2009. 6. 19. 16:48
// Author : saylloyd@gmail.com /*! \brief MBCS 문자열을 WideChar 문자열로 변환하는 함수 WideChar를 받을 버퍼의 공간이 확보되어있어야 한다. \param[in] _M_ 변환할 MBCS 문자열 \param[out] _W_ 변환된 WideChar를 받을 버퍼 \see */ #define M2W(_M_, _W_) {\ int nSize=0;\ nSize=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (_M_), -1, NULL, 0);\ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (_M_), -1, (_W_), nSize);\ } /*! \brief MBCS 문자열을 WideChar 문자열로 변환하는 함수 WideChar를 받을 버퍼의 공간을 할당하여 반환한다. 사용이 끝나면 FREE_M2W 매크로를 이용하여 메모리를 해제한다. \param[in] _M_ 변환할 MBCS 문자열 \param[out] _W_ 변환된 WideChar를 받을 버퍼 \see FREE_M2W */ #define ALLOC_M2W(_M_, _W_) {\ int nSize=0;\ nSize=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (_M_), -1, NULL, 0);\ (_W_)=(PWCHAR)calloc(nSize+1, sizeof(WCHAR));\ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (_M_), -1, (_W_), nSize);\ } /*! \brief ALLOC_M2W 매크로에서 할당된 메모리를 해제하는 함수 \param[in] _W_ 해제할 WideChar 버퍼 \see ALLOC_M2W */ #define FREE_M2W(_W_) free((_W_)); /*! \brief WideChar 문자열을 MBCS 문자열로 변환하는 함수 MBCS를 받을 버퍼의 공간이 확보되어있어야 한다. \param[in] _W_ 변환할 WideChar 문자열 \param[out] _M_ 변환된 MBCS를 받을 버퍼 \see */ #define W2M(_W_, _M_) {\ int nSize=0;\ nSize=WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (_W_), -1, NULL, 0, NULL, NULL);\ WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (_W_), -1, (_M_), nSize, NULL, NULL);\ } /*! \brief WideChar 문자열을 MBCS 문자열로 변환하는 함수 MBCS를 받을 버퍼의 공간을 할당하여 반환한다. 사용이 끝나면 FREE_W2M 매크로를 이용하여 메모리를 해제한다. \param[in] _W_ 변환할 WideChar 문자열 \param[out] _M_ 변환된 MBCS를 받을 버퍼 \see FREE_W2M */ #define ALLOC_W2M(_W_, _M_) {\ int nSize=0;\ nSize=WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (_W_), -1, NULL, 0, NULL, NULL);\ (_M_)=(PCHAR)calloc(nSize+1, sizeof(CHAR));\ WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (_W_), -1, (_M_), nSize, NULL, NULL);\ } /*! \brief ALLOC_W2M 매크로에서 할당된 메모리를 해제하는 함수 \param[in] _M_ 해제할 MBCS 버퍼 \see ALLOC_W2M */ #define FREE_W2M(_M_) free((_M_));
Hex Code 를 File 로 저장하는 소스코드
CODE2009. 5. 20. 15:40
void UTIL_HexDump(unsigned char* FileName, unsigned char* buf, long len) { FILE *fi = 0; int i = 0; long start = 0; unsigned int TempPort = 0; if( !FileName ) return; if( !buf ) return; fi = fopen( (const char*)FileName, "a+t"); if( len == -1 ) { fprintf( fi, "\n=====%s=====\n", buf); fclose( fi ); return; } if( len == -2 ) { fprintf( fi, "%s", buf); fclose( fi ); return; } while( len > 0L ) { fprintf( fi, "%6.6X:", start ); for( i = 0; i < 8; ++i ) { if( len - i > 0 ) fprintf( fi, " %2.2X", buf[ i ] & 0xFF ); else fprintf( fi, " " ); } fprintf( fi, ":" ); for( i = 8; i < 16; ++i ) { if( len - i > 0 ) fprintf( fi, " %2.2X", buf[ i ] & 0xFF ); else fprintf( fi, " " ); } fprintf( fi, " " ); for( i = 0; i < 16; ++i ) { if( len - i > 0 ) { if( buf[i]>=0x20 && buf[i]<=0x7e ) fprintf( fi, "%c", buf[ i ] ); else fprintf( fi, "%c", '.' ); } else fprintf( fi, "%c", '.' ); } fprintf( fi, "\n" ); len -= 16; start += 16L; buf += 16; } fclose(fi); return; }