GetModuleFileName 함수는 현재 실행되고 있는 프로세스의 이름을 얻어오는 함수이다. 


MSDN에 정의된 GetModuleFileName API


DWORD WINAPI GetModuleFileName(
  _In_opt_  HMODULE hModule,
  _Out_     LPTSTR lpFilename,
  _In_      DWORD nSize
);


첫 번째 인자는 이름을 얻어올 프로세스의 핸들이지만, 보통 자신의 이름을 얻기 위해 사용되므로 

NULL로 사용되는 경우가 대부분이다.  첫 번째 인자에 NULL을 넣어 사용하면 현재 자신의 이름을 얻어오고

그 외 다른 프로세스의 핸들을 전달하거나 DLL파일의 핸들을 전달하면 해당 모듈의 파일 이름을 얻어온다. 


두 번째 인자는 해당 모듈의 이름이 입력될 버퍼를 넣어주면 되고 


세 번째 인자는 버퍼의 사이즈를 넣어주면 된다. (이런 사이즈인수는 대부분 버퍼오버플로우 공격을 하지 못하도록 하기 위함이라고 보면 된다. 그외 오버 플로우로 인한 버그의 소지도 예방할 수 있음.)

Posted by $Zero
:

DLL 코드 작성


DLL 코드에는 winMain 함수처럼


DllMain 콜백 함수가 정의 된다.


DllMain을 정의하지 않더라도 컴파일이 되는데, 이는 컴파일러가 내용이 텅 빈(empty) dummy code를 삽입하기 때문이다.


반드시 필요하지만 정의하지 않을경우 컴파일러가 Default DllMain을 삽입해준다는 소리다.



DllMain 함수의 모양은 아래와 같다.


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
    switch(dwReason)
    {
    case DLL_PROCESS_ATTACH:
        break;

    case DLL_PROCESS_DETACH:
        break;

    }

    return TRUE;
}


일단 첫 번째  인자는 winMain의 hInstance와 같은 역할을 하는 DLL자신의 인스턴스이다.


두 번째 인자 dwReason은 DLL이 호출된 이유를 담고 있다. 위 Switch 문이 그 값에 해당한다.

DLL_PROCESS_ATTACH: DLL파일이 처음 프로세스에 로딩되었을 때 (ex : LoadLibrary() 호출)

DLL_PROCESS_DETACH: DLL파일이 프로세스에서 해제 되었을 때  (ex : FreeLibrary() 호출)

이 외에도 스레드 관련 값이 2개 더 있다. (MSDN 참조)





Posted by $Zero
:

Oracle 을 설치할때 DISPLAY변수 문제가 뜨는건 로그인할때의 계정과 오라클 인스톨 실행파일의 실행 계정이 달라서이다. 


Oracle설치는 X-Window로 진행되다보니 모니터환경설정을 조사하는데 


이때 모니터 환경조사에 사용되는 /usr/bin/xdpyinfo는 x-window로 로그인을 했던 계정만이 참조할 수 있다 . 


때문에 오라클 설치시 oracle 전용계정이 아닌 다른 계정으로 로그인 한 경우 설치가 진행되지 않는다. 


로그아웃후 oracle계정으로 로그인해서 진행하면 정상적인 설치가 진행된다. 

Posted by $Zero
:

1. mysql  프로세스 kill
 
2.싱글모드로 실행
./mysql/bin/mysqld_safe --user=mysql --skip-grant-tables &

3. root 패스워드를 변경

mysql> use mysql;
mysql> update user set password=password('새로운암호입력') where user='root';
mysql> flush privileges;

Posted by $Zero
:

auditd  = 리눅스 감시 서비스.

 

crond = cron 관련 서비스

 

dbus-daemon = dbus관련 서비스. dbus는 IPC같은 프로세스간의 통신 버스.

 

fcoemon = fc카드 관련 서비스 . 검색이 더 필요.

 

apmd = 전원관리 데몬. 노트북의 배터리등 관리 가능.

 

atd = 지정된 시간에 특정 작업을 실행하는 데몬. at와 관련있음. 

 

at = 스케쥴링을 위한 유틸리티. 문제가 많아 잘 사용되지 않음.

 

gpm = 텍스트 프롬프트 상에서 마우스로 문자를 선택 및 복사를 할 수 있게 해주는 유틸리티.

 

bdflush, kupdate = 리눅스 2.4버전까지 시스템버퍼에 쌓여있는 내용을 디스크로 기록하는 데몬.

 

keventd = 워크 큐 처리담당 데몬

 

klogd = 시스템에는 부팅과 관련된 메시지를 포함하여 커널관련 메시지를 담는 약 8196bytes의 버퍼크기를 갖고 메시지를 기록하는 데 이 메시지를 기록하는 데몬이 klogd이다.

 

syslogd = 커널과 여러가지 시스템 프로그램들은 각종 에러와 경고메시지, 기타 일반적인 메시지들을 출력한다. 이런 메시지들을 파일로 기록하는 데몬이다.

 

ksoftirqd 은 cpu 당 하나씩 존재하는(per-cpu) 커널 쓰레드로 구현되어 있으며, 소프트 인터럽트가 많이 발생한 경우 실행된다. 소프트 인터럽트는 일반적으로 하드 인터럽트 처리 루틴이 반환되는 시점에 실행되지만, 소프트 인터럽트가 처리될 수 있는 수준을 넘어서 생성될 수 있어서, 한 소프트 인터럽트가 처리되는 중에 새로운 소프트 인터럽트가 생성되면ksoftirq 데몬이 실행되어 소프트 인터럽트를 프로세스 컨텍스트에서 처리한다. 만약 ksoftirqd 가 CPU를 많이 점유하고 있다면, 시스템에 많은 양의 소프트 인터럽트가 발생하고 있다는 뜻이다. 

 

kswapd = 스왑 관련 데몬

 

Portmap는 RPC(:12) 프로그램이름을 DARPA 프로토콜 port(:12) 번호로 변경해주는 서버다. RPC 서비스를 위해서는 반드시 실행되어 있어야 한다.
RPC 서버가 시작되면 portmap는 해당 rpc 서버가 어떤 포트에 listen(2)하고 있어야하는 지를 알려준다. 그러면 RPC 서버는 해당 포트에서 데이터를 기다리게 된다.



리눅스의 기초와 의존성 문제 해결을 위한 기반지식을 쌓으라고 내준

팀장님의 과제 .


Posted by $Zero
:

count = SendMessage(hList, LB_GETSELCOUNT, 0, 0);

            SendMessage(hList, LB_GETSELITEMS, 100, (LPARAM)cursel);

            for(int i=count-1; i>-1; i--)

            {

                SendMessage(hList, LB_DELETESTRING, cursel[i],0);

            }


선택된 여러 셀들을 삭제하려면


LB_GETSELCOUNT메시지를 보내 현재 선택된 셀의 갯수를 구하고


LB_GETSELITEMS 메시지를 보내 선택된 셀들의 인덱스를 담고있는 배열을 받아야한다


GETSELITEMS 메시지는 LPARAM에 전달된 배열에 인덱스를 채워주고 리턴된다. 


그리고 for문을 돌며 삭제를 해야하는데 이 때 , 반드시 거꾸로 삭제를 진행해야만 한다.


총9개의 셀이 선택됐다면, 배열은 0~8번까지 차있고


배열의 인덱스 8부터 시작해서 0까지 참조후 삭제해야 정상적인 삭제가 이뤄진다. 


0부터 8까지 올림차순으로 삭제를 진행하면 정상적인 삭제가 이뤄지지 않는다. 


예를들어


리스트 박스의 1,2,3 번째 셀이 선택되어 있다면


1번 셀을 지웠을경우 2번 셀이 1번 셀의 자리로 이동된다. 


그 때문에 다음에 2번 셀을 지울때 3번 셀이 2번으로 이동되어있기 때문에 3번 셀이 지워지며 3번 셀을 지우려고하면 해당 데이터가 없는상황이 발생한다.


그러므로 listbox의 셀을 지울땐 반드시 거꾸로 진행해야 한다. 



Posted by $Zero
: