Search

MSDN Reference : http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpsa,
  DWORD cbStack,
  LPTHREAD_START_ROUTINE lpStartAddr,
  LPVOID lpvThreadParam,
  DWORD fdwCreate,
  LPDWORD lpIDThread
);




lpsa
무시한다. NULL로 설정

cbStack
스레드를 위한 메모리 스택의 크기. STACK_SIZE_PARAM_IS_A_RESERVATION flag가 켜지지 않았다면 무시한다.

lpStartAddr
스레드에 의해 호출되는 함수의 포인터

lpbThreadParam
lpStartAddr 이 호출하는 함수의 매개변수


fdwCreate
스레드가 생성되고난 후의 상태

CREATE_SUSPENDED : 스레드를 만든 후 Suspend 시킨다. ResumeThread 로 다시 Suspend에서 나올 수 있다.

STACK_SIZE_PARAM_IS_A_RESERVATION

lpIDThread
생성된 스레드의 스레드 ID를 받아온다. 필요없다면 NULL을 준다.


함수를 실행하면 lpStartAddr에 명시된 함수를 불러오며 스레드를 새로 만들어 실행시킨다

SAMPLE CODE
DWORD WINAPI Thread1(LPVOID lpArg); // 스레드를 위한 함수
HANDLE hd;
hd = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL );

- 레지스트리 키 등록
LONG RegCreateKeyEx(

     HKEY        hKey,  
     LPCTSTR   lpSubKey
,  
     DWORD     Reserved
,  
     LPTSTR     lpClass
,  
     DWORD     dwOptions
,  
     REGSAM    samDesired
,  
     LPSECURITY_ATTRIBUTES lpSecurityAttributes
,  
     PHKEY      phkResult
,  
     LPDWORD 
lpdwDisposition
);

hKey 
생성할 키의 루트키. 또는 RegCreateKeyEx 나 RegOpenKeyEx 로 반환된 키.
보통 아래의 루트키중 하나를 넣어줍니다.
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS


lpSubKey
생성할 서브키(문자열)
키이름에 백슬래쉬( \ )는 사용해선 안됩니다.

Reserved 
예약된 인자. 반드시 0 을 주어야함.


lpClass 
키의 지정된 클래스명(문자열)  (정확한 용도는 모르겠습니다.)
필수 아님 ( 보통 NULL을 줍니다. ) 


dwOptions 
아래의 옵션값을 사용합니다.

REG_OPTION_BACKUP_RESTORE ( 0x00000004L )   : 이 옵션을 사용하면 samDesired는 무시됩니다.
권한과 보안에 따라 키를 열고 백업 및 복구 등의 행동을 취하는 방법을 달리하는 것같습니다.
(잘모르겠음)

REG_OPEN_NON_VOLATILE ( 0x00000000L ) : 정보를 파일에 기록합니다. ( 보통 이 옵션을 사용 )

REG_OPTION_VOLATILE ( 0x00000001L ) : 정보를 메모리에 기록합니다. ( 시스템종료시 기록이 지워집니다. )


samDesired 
생성된 키에 주어지는 권한.
그냥 모든 권한을 줄때는 KEY_ALL_ACCESS 를 인자로 줍니다.
자세한 내용은 레지스트리 키 보안과 접근 권한을 참고하세요.

lpSecurityAttributes 
SECURITY_ATTRIBUTES 구조체의 포인터. (필수 아님 , 보통 NULL을 준다.)
자식프로세스 상속과 관련된 내용같은데 잘 모르겠음.


phkResult 
생성된 키의 핸들포인터.
키가 루트키가 아닌경우에는 RegCloseKey를 사용하여 키를 해제해야 합니다.


lpdwDisposition 
DWORD의 포인터, 생성된 키의 상태를 알려줍니다. ( 필수아님, 보통 NULL을 줍니다.)

반환되는 결과값은 아래와 같습니다.
REG_CREATED_NEW_KEY ( 0x00000001L )  : 새로 생성된 키
REG_OPENED_EXISTING_KEY ( 0x00000002L ) : 기존에 존재하던 키 

 SAMPLE CODE

HKEY regResult = 0;

LONG ret = 0;

DWORD dwDisp;

 

// registry 키 등록

ret = RegCreateKeyEx( HKEY_LOCAL_MACHINE,

 L"Software\\Test", 

0, 

NULL,

REG_OPTION_NON_VOLATILE, 

KEY_ALL_ACCESS, 

NULL, 

&regResult, 

&dwDisp );








- 레지스트리 값 등록

LONG RegSetValueEx(
  HKEY hKey,
  LPCWSTR lpValueName,
  DWORD Reserved,
  DWORD dwType,
  const BYTE* lpData,
  DWORD cbData
);
MSDN Refernce : http://msdn.microsoft.com/en-us/library/ms724923(VS.85).aspx
hKey 
생성할 키의 루트키. 또는 RegCreateKeyEx 나 RegOpenKeyEx 로 반환된 키.
보통 아래의 루트키중 하나를 넣어줍니다.
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS


lpValueName
생성할 항목의 이름
해당 항목이 존재치 않는다면 해당 항목을 추가하고, 기존에 존재한다면 해당 항목에 값을 쓴다.

Reserved 
예약된 인자. 반드시 0 을 주어야함.

dwType
lpData의 데이터 타입을 명시한다.
REG_DWORD, REG_SZ

lpData
설정할 항목에 들어갈 데이터가 들어있는 메모리의 주소값

cbData
lpData 매개변수에 사용한 메모리의 크기


SAMPLE CODE

BYTE data = 0;

RegSetValueEx(regResult, 

L"Start", 

0, 

REG_DWORD, 

&data, 

sizeof(REG_DWORD)  );








 - 레지스트리 키 열기

LONG RegOpenKeyEx( 
  HKEY hKey, 
  LPCWSTR lpSubKey, 
  DWORD ulOptions, 
  REGSAM samDesired, 
  PHKEY phkResult 
); 

hKey 
생성할 키의 루트키. 또는 RegCreateKeyEx 나 RegOpenKeyEx 로 반환된 키.
보통 아래의 루트키중 하나를 넣어줍니다.
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

lpSubKey
OPEN할 서브키(문자열)
키이름에 백슬래쉬( \ )는 사용해선 안됩니다.

ulOption
0 을 준다.

samDesired 
생성된 키에 주어지는 권한.
그냥 모든 권한을 줄때는 KEY_ALL_ACCESS 를 인자로 줍니다.
자세한 내용은 레지스트리 키 보안과 접근 권한을 참고하세요.

phkResult 
OPEN된 키의 핸들포인터.
키가 루트키가 아닌경우에는 RegCloseKey를 사용하여 키를 해제해야 합니다.


SAMPLE CODE
HKEY regResult;
RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"Software\\Test", 0, 0, &regResult );







- 레지스트리 값 열기


LONG RegQueryValueEx( 
  HKEY hKey, 
  LPCWSTR lpValueName, 
  LPDWORD lpReserved, 
  LPDWORD lpType, 
  LPBYTE lpData, 
  LPDWORD lpcbData 
); 


SAMPLE CODE
BYTE retValue;
DWORD data_size = sizeof(REG_DWORD);
RegQueryValueEx(regResult, L"Start", 0, NULL, &retValue, &data_size );