WinGate 깔았더니 블루스크린이 떠요

최근 펜티엄4 프레스캇, 듀얼 코어 등 이상의 고사양 PC로 업그래이드 하신 분들에게 많이 나타나는 증상이다.

이는 DEP(Data Execution Prevention)이라는 기능으로
바이러스가 이제는 데이터영역까지 침범하여 PC를 망가트려서 인텔측에서 고안한 방법인데
하기와 같이 간단한 처리를 해주면 WinGate를 정상적으로 사용할 수 있다.

[1] WinGate를 설치하고 (버젼과 상관없음. 아무 버젼이나)

[2] 다음과 같이 boot.ini를 수정한다.

C 드라이브 루트에서 BOOT.INI 항목을 엽니다.
(해당 파일이 보이지 않을 시 제어판 -> 폴더 옵션 -> 보기 -> ‘보호된 운영체제 파일 숨기기’, ‘알려진 파일 형식의 파일 확장명 숨기기’ 의 체크를 제거합니다. ‘숨김 파일 및 폴더 표시’ 에 체크 합니다.)
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)WINDOWS=”Microsoft Windows XP Professional” /Noexecute=option /fastdetect

해당 항목 중 NoExecute 를 Execute (DEP 기능 비활성화) 로 변경 후 저장하시면 됩니다

※ boot.ini가 read only이므로 writable하게 수정하고 저장하시는것 잊지마시기 바람돠.

산호세의 아울렛 쇼핑 명물 ‘그레이트몰(Great Mall)’

실리콘벨리에도 쇼핑이라는것을 할만한 곳이 있었으니…

짜쟌…

그곳이 바로 그레이트몰이다.


그레이트몰은 밀피타스에 위치한 대형 쇼핑몰로 그 규모만 보더라도 입이 떡 벌어지게 된다.

산호세의 아울렛 쇼핑 명물 '그레이트몰(Great Mall)'

진지하게 쇼핑을 해볼라 하면, 하루종일 쇼핑해도 모자란다는…

산호세에 갈 일이 있는 사람으로
좋은 물건을 저렴하게 구입하고자 하는 사람은 그레이트몰 가는것을 강력 추천한다.

산호세의 아울렛 쇼핑 명물 '그레이트몰(Great Mall)'

건물 내부에는 의류, 가전, 약, 화장품 등 모든 종류의 상품이 아울렛의 형태로 있으며
나이키, 폴로 등 유명 메이커들이 포진해 있다.

기기 관련해서는 레디오 셱(Radio Shack) 및 가전 할인 몰이 있으며
장난감을 구입하는 사람이면 현란한 장난감 구경에 보다 지쳐 가리라 생각된다.

산호세의 아울렛 쇼핑 명물 '그레이트몰(Great Mall)'

구경하다 지칠 사람들을 위하여 다양한 국가의 요리를 맛볼 수 있는 푸드코트 또한 준비되어져 있다.

산호세의 아울렛 쇼핑 명물 '그레이트몰(Great Mall)'

난 개인적으로 몽골리안BBQ를 좋아하는데
혹자는 한국음식이 독특하다고 하는 사람도 있다.

주인은 한국사람인것 같은데 종업원들은 다른 인종 사람들이었다.


그레이트몰 내부 지도는 대략 다음과 같다.
(더 자세한 지도는 입수할 수가 없었다)

 산호세의 아울렛 쇼핑 명물 '그레이트몰(Great Mall)'

대충 규모를 이야기하자면
국내 왠만한 대학의 한 캠퍼스 규모 혹은 그 이상이라고 생각해도 될것 같다.

혹시 뚜벅이가 있다면 지하철을 타는것도 괜찮다.

단, Mountain View쪽에서 출발하는 사람은
30분마다 한번오므로 인내력을 좀 갖고 지하철을 타야 한다.


주소: 447 Great Mall Dr. Milpitas, CA 95035
전화: (408) 956-2033

산호세의 아울렛 쇼핑 명물 '그레이트몰(Great Mall)'


영업시간
월 – 토: 오전10시 – 오후9시
일요일: 오전11시 – 오후8시

아름다운 사랑이야기

시골에서 농사를 지으며 살아가는 청년이 있었습니다.

준수한 외모에 시원 시원한 성격,섬세한 배려까지
어느 하나 나무랄데 없는 너무나 아름다운 청년이었습니다

하지만 농촌을 좋아하는 여자가 없어서
청년은 결혼을 못했습니다.
청년은 어느날부터 컴퓨터를 장만 하고
인터넷을 하면서 도시에 사는 젊은 사람들과 카페에서 활동을 하다가
어느 여자와 이멜을 주고 받게 되었습니다.

청년은 ‘바다’라는 닉네임을 가졌고
여자는 ‘초록물고기’였습니다.
청년이 느끼기에 여자는 박학다식하면서도 검소하고
아름다운 마음을 가지고 있어 보였으며
농촌에 대해서도 많은 이해를 하고 있어 보였습니다.

여자와 주고 받는 메일의 횟수가 많아질 수록
청년의 가슴속에는 여자를 향한 분홍빛으로
사랑이 싹틈을 느낄수가 있었습니다.
이메일을 1000여통을 주고 받으면서
두사람이 무척 가까와 졌을 때 청년은 뜨거운 마음을 담아 프로포즈를 보냈습니다.

그러나 그가 가까와 지고자 할 수록 여자는 점점 움츠려 들며 멀어져 갔습니다.
마치 눈덩어리에 입김을 불어 넣어서 따뜻한 온기를 넣어 주고 싶어하지만
그 온기에 눈물로 녹아지는 눈덩이처럼 여자는 자꾸만 작아졌습니다.

청년이 사랑을 고백하기 전에는 하루에 열통씩 오가던 메일이
사랑을 고백하고 나서는 일주일을 기다려야 답장이 오곤했습니다.
그 마저도 답장은 늘 한,두줄의 짧은 답이었습니다.

청년은 절망을 했습니다.
그토록 믿어 왔던, 또 믿고 싶었던
늦게 찾아온 사랑에 더욱 더 절망을 했습니다.

누구도 시골은 싫은가 보구나
다 이상일 뿐이야
나처럼 힘들고 열악한 환경에서 농촌을 지키고자 하는 내가 바보지.
누가봐도 이건 바보짓이야…’

그렇습니다.
청년은 대학을 나와서 다른 친구들 좋은 직장으로 취직을 하고자 할 때
우루과이 라운드로 농촌이 신음을 할 때
농촌을 지키고자 부모님 반대를 무릎쓰고
농촌에 정착을 했지만 정작 견디기 힘든 것은 외로움이었습니다.

청년은 도무지 일이 잡히지 않았습니다.
그여자의 닉네임이 ‘초록물고기’란 것 밖엔…
자신이 얼굴도 모르는 여자에게 이렇게 빠져 버릴줄은 몰랐습니다.

그 무엇에도 두렵지 않던 자신이 이제는 초록물고기가 사라질까
두려워 하는 것 이었습니다.
한 달째 멜 수신 확인이 안되었습니다.

의도적으로 피하는지 아니면 무슨 일이 있는지
도저히 알 수가 없습니다.
청년은 다시 절실하게 여자에게 멜을 보냈습니다.

♥초록물고기님!!
너무나 절실해서 가슴으로 울어 보지 않은 사람은 모릅니다.
남들은 쉽게 잠이 드는 밤,
술 기운을 빌려서 잠이 들어 보지 않은 사람은 모릅니다.

사랑하는 이가 그리워도 보지 못하는 아픔을
견뎌 보지못한 사람은 모릅니다.
그 사람이 얼마나 고통스러워 하는지.
그 속이 타서 얼마나 쓰린지…

한 달 후 쯤…
그토록 애타게 기다리던
초록물고기에게서 이멜이 왔습니다.

바다님!
나 당신을 사랑해도 될까하고
많은 시간 고민을 했습니다.
그러나 저는 어릴적부터
한쪽 다리가 불편한 소아마비를 앓고 있습니다.

그리고 또한
얼굴도 어릴적 덴 화상으로 흉터가 많이 져 있답니다.
그래서 직장생활은 커녕 집안에서 어둔 커텐으로
햇살을 가리고 혼자서 살아가고 있습니다.

저는 가진 것도 없습니다.
더구나 몸마저 이래서 누구하나 쳐다보지 않습니다.
그동안 사이버상에서 많은 사람들을 사랑하고 사랑을 주고 싶었지만
다들 저를 보면 그만 돌아섰습니다.

그 이후엔 사람을 만나는 일이 두려워
저에게 호감을 주는 남자가 있다면 먼저 돌아서곤 했습니다.
사랑을 하기도 전에 버림을 받는 제 자신이 너무 가여워서지요.

바다님에게 멜을 받은 순간 기쁘고 설레였으나
바다님에 대한 좋은 감정을 가지고 있는 저에게
다시 아픔을 줄 수가 없어서 바다님에게 다가갈 수가 없었습니다.
이런 저를 사랑할 수 있다고 자신을 합니까?

청년은 눈앞이 아득해졌습니다.
기다리고 기다리던 여자의 소식이었지만
여자의 결점을 알고 나니 혼란이 생겼습니다.

부모님의 실망 하시는 모습을 떠올리자 청년은 너무 괴로웠습니다.
육체보다는 영혼이 중요하다고 자부하던 청년이었기에
고통스러울 뿐 이었습니다.

자신은 위선자가 되는 것입니다.
남의 일에는 정신을 중요시 하면서
자신의 일은 껍데기를 더욱 중요시 하는 것이었습니다.
몇날 몇일을 고민하던 청년은 여자에게 다시 이멜을 보냈습니다.

♥초록물고기님!
이제 당신에게
사랑한다는 말을 해야겠습니다.
사랑하는 내 단 한 사람…

초록물고기님!!
당신에 대해서 고민을 많이 했습니다.
하지만 당신에게는 건강한 몸을 가진 내가
또한 저에게는 아름다운 영혼을 가진
당신이 필요하다는 것을 알았습니다.

당신이 말한 당신의 결점은
오히려 나에겐 기쁨이 된다는 것을 깨달았습니다.
바위틈에 조용히 피어나
눈길 한번 받지 못하는 제비꽃처럼
저만 당신을 사랑할 수 있는 자격이
주어지는 것이기 때문입니다.

초록물고기가 바다의 품에서 맘대로 헤엄치는 날
나는 비로소 내 스스로
당신을 사랑할 자격이 있다고 말하겠습니다.
초록물고기가 너른 바다에서
자유로이 헤엄칠 자유를 드리겠습니다…

얼마후 두사람은 서로 만나기로 하였습니다.
청년은 여자의 불편한 몸이 걱정이 되어
서울로 올라가겠다고 하였지만
사는걸 보고 싶어하는 여자의 부탁으로
지금은 폐교가 된 국민학교에서 만나기로 하였습니다.

여자는 그녀의 전화번호도 알려주지 않고
무작정 0월 00일 학교에서
가장 큰 나무 밑에서 만나자고 하였습니다.

그리고 드디어 0월 00일..
청년은 여자가 혹 못찾을까봐
한 시간 반이나 먼저 나가서 여자를 기다렸습니다.

여자는 남자의 애 간장을 다 태우고 20분이나 늦게 도착을 했습니다.
교문에서부터 웬 날씬한 여자가 목발을 짚고 머리엔 노란 스카프를 두른 채
뚜벅뚜벅 거리며 청년의 눈에 점점 크게 다가왔습니다.

“혹 초록물고기님이시나요?”
“그럼 바다님 맞나요?”
여자는 부끄러운 듯이 살며시 고개를 숙이더니
“이제 저를 보여 드리겠어요” 하더니
여자는 안경을 벗고 스카프를 벗어서 나뭇가지에 걸었습니다.

그 순간 남자는
눈이 휘둥그레지고 얼굴이 화끈거렸습니다.
여자는 얼굴에 흉터 하나 없이 우윳빛 얼굴에 이목구비가 또렷한
굉장한 미인이었습니다.

그리고 여자는 목발을 내리고
아무렇지도 않게 나무밑 벤취에 앉더니 환한 미소를 지으며
“놀랬나요?
처음부터 속이려던 것은 아닙니다.
다만 내 영혼을 사랑하는 사람을 만나고 싶을 뿐이었습니다.
이제 당신의 바다에서 헤엄쳐도 될까요?”

청년은 물기어린 눈빛으로 와락 여자를 껴안았습니다.
두 사람은 가슴엔 또 다른 전율을 느끼면 내면엔하염없는 뜨거운 눈물을 흘러다나요….비록 사이버상 사랑 이지만너무 아름다운 사랑이 아닐런지…
남자의 인생에는 세가지 갖고 싶은 게 있다. 하나는 자신을 징그러울 만큼 꼭 닮은 아들이고 하나는 죽을 때까지 잊을 수 없는 첫사랑이고 하나는 목숨 다할 때까지 효행하고픈 부모이다.

구글(Google) 검색, 가이드라인 수정

오랫동안 변하지 않았던 구글 검색(Google Web Search)의 가이드라인에 일부가 수정되었습니다. 수정안에 따르면, 주소에 id 파라미터가 들어간 웹페이지도 검색에 포함된다고 합니다. 그 내용을 알아봅니다.

구글 검색엔진은 다른 엔진과는 다른 몇가지 특징을 갖고 있는데, 그 중 하나가 주소(URL)에 id라는 파라미터를 갖고 있는 웹페이지는 보안 문제로 인해 검색대상에서 제외합니다.

이번의 업데이트는 id 파라미터가 있다손 치더라도 검색에서 제외하지 않는다는 것입니다.

하지만, 또다른 특징인 큰 숫자가 들어간 주소는 검색에 후순위로 밀리는 것은 여전히 남아있습니다. 이런 이유로 이글루스(SK 커뮤니케이션즈의 블로그 서비스)가 구글 검색에서 상위에 나타나는 일은 그다지 많지 않습니다.

그리고, 세션을 사용하는 툴, 예를 들어 태터툴즈나 phpbb와 같은 프로그램은 구글 검색에서 세션에 대한 조치를 취하지 않는다면 검색의 상위에 나타나기가 힘듭니다.

이런 검색엔진 최적화(SEO)에 대한 내용은 같은 페이지 랭크일 경우 더 좋은 위치를 보장하거나 검색엔진에 잘 걸리게 합니다.

아이트래킹으로 유추해보는 구글 광고

아이트래킹은 사람의 시선이 모니터의 어느 부분을 보고 있는지를 색깔로 보여주는 일종의 실험입니다. 실험팀은 웹의 유저빌러티를 보기위해 구글을 예로 들었는데, 이삼구글에서는 역으로 광고의 효과에 대해서 언급해보려 합니다.

사진을 보기 전에 구글엔 크게 두가지 광고가 있습니다. 키워드광고라고도 불리우는 검색광고와 문맥을 분석해서 보여주는 문맥광고, 그리고 둘을 합쳐서 애드센스라고 합니다.(구글 자체 사이트일 경우는 애드센스라 하지 않음)

그럼 두가지 광고의 아이트래킹 사진을 보도록 하겠습니다.

검색광고(키워드 광고)

아이트래킹으로 유추해보는 구글 광고

위의 사진은 검색 골든 트라이앵글이라고도 불리우는 것으로 신기하게도 사용자의 시선이 스폰서광고와 검색창에 뭉처있는 것을 알 수 있습니다. 이 결과로 일부 블로거는 구글이 미리 스폰서 광고의 위치를 잡을 때 이 실험을 해 본것이 아닐까 라는 추측이 나오기도 했습니다.

문맥광고

아이트래킹으로 유추해보는 구글 광고

화면에 보면 알겠지만 우측의 애드센스 광고는 사용자의 시선이 거의 가지 않는 것을 알 수 있습니다. 전통적으로 화면 우측 광고를 스카이스크래퍼라고 하는데 웹사이트 상단과 우측은 인터넷 초창기부터 표준 위치일 정도로 인기있는 자리입니다.

그럼에도 불구하고 위 사진은 사용자의 눈길을 전혀 끌지 못하고 있음을 알 수 있습니다. 전문적인 용어로 이러한 현상을 Ad Blindness라고 하고 그 의미는 사용자가 광고가 있음에도 불구하고 없는 것 처럼 무시한다는 내용입니다.

Ad Blindness는 광고자가 가장 우려하는 것으로 초창기 이미지 광고의 클릭율(CTR)이 3-5%였던 데에 반해 현재는 0.1% 정도로 낮아진 전례가 있습니다. 이 것은 이삼구글에서 예전에 언급한 광고 신뢰도의 문제와 일맥상통하는 면도 있습니다.

미래 예측

이 실험에 따르면 블로그의 경우 광고가 컨텐츠와 밀접하게 붙어있어야 함을 알 수 있습니다. 전통적인 스카이스크래퍼 형식은 Ad Blindness를 피할 수 없기 때문입니다. 불가피한 이런 상황은 사용자가 광고를 아예 보지 않음으로서 생기는 일입니다.(만약 구글의 클릭율(CTR)이 10%만 낮아진다고 해도 10% 이상의 수익이 날라갈 수 있습니다.)

구글 애드센스팀에서 알려준 블로그의 애드센스 효과에 대한 그림에서 빨간색 이하 그 후순위 부분은 전혀 신경쓸 필요가 없음을 의미하기도 합니다.

그리고, 검색광고(키워드 광고)의 경우 아직까지 주목도가 매우 높기 때문에 페이비뷰 당 광고 수익률은 당분간은 괜찮겠지만, 인터넷 광고시장의 역사를 돌아볼 때 언제 사용자들의 Ad Blindness가 생길지 알 수 없습니다.

광고 게시자는 자신의 웹사이트가 검색형인지 컨텐츠형인지 알 필요가 있습니다. 그리고, 올블로그와 같은 메타사이트의 경우 검색결과의 최상단에 광고를 넣는다면 좋은 효과가 생길 수 있음을 이 결과를 통해서도 알 수 있습니다.

mdb 파일의 암호깨기

벼래별게 다 있다. MDB 암호깨기 소스 !!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

FILE *mdb;

int XORTable97[14] =
{
    0x86,0xFB,0xEC,0x37,0x5D,0x44,0x9C,0xFA,
    0xC6,0x5E,0x28,0xE6,0x13,0xD8
};

int XORTable2000[20] = {
    0xffffffD3,0xffffffEC,0x8,0xffffff9C,0xffffff93,0x28,0x46,0xffffff8A,0x1,0x7b,
    0xffffffA0,0xffffffDF,0x22,0x13,0xffffff9A,0xffffffB1,0x61,0x79,0xffffffC7,0x7C
};

void Usage(char *szExe)
{
    printf(”
==================================================================”);
    printf(”
이프로그램은 MS Acces97 및 2000에서 만들어진”);
    printf(”
.mdb파일의 암호를 단방에 찾아내는 프로그램입니다.”);
    printf(”
MS아이들 이프로그램보면 경악하실겁니다.”);
    printf(”
MS아이들아, Access빨랑빨랑 업데이트해라!
“);
    printf(”
이용방법: %s .mdb파일이름 version”,szExe);
    printf(”
version:”);
    printf(”
97   – MS Access97″);
    printf(”
2000 – MS Access2000″);
    printf(”
2003년 12월 18일 by KHN (kys197543@hotmail.com)
“);
    //장난
    printf(”
(\_______/)”);
    printf(”
 / @__@ “);
    printf(”
(  (oo)  )”);
    printf(”
 `-.~~.-‘”);
    printf(”
  /      “);
    printf(”
@/      \_”);
    printf(”
(/ /     )”);
    printf(”
WW`—-‘WW”);
    printf(”
==================================================================

“);
}

void GetPassword(int *szXORTable,int nLen,int step)
{   
    int i;
    char ch;

    printf(“암호는 다음과같습니다 : “);
    for(i=0;i<nLen;i++)
    {
        if((ch=fgetc(mdb)^szXORTable[i])==0) break;
        fseek(mdb,step-1,SEEK_CUR);
        putchar(ch);
    }
    if(i==0) printf(“(암호는 없습니다.)”);
    putchar(‘
‘);
}

int main(int argc, char *argv[])
{
    int ver;
    char szVer[5];

    Usage(argv[0]);

    if(argc<3) 
    {
        exit(1);
    }

    strcpy(szVer,argv[2]);

    if((mdb=fopen(argv[1],”rb”))==NULL) 
    {
        printf(“%s 파일을 찾을수없습니다
“,argv[1]);
        exit(1);
    }

    fseek(mdb,0x42,SEEK_SET);
    ver = atoi(szVer);
    if (ver == 97)
        GetPassword(XORTable97,14,1);
    if (ver == 2000)
        GetPassword(XORTable2000,20,2);
    if (ver != 97 && ver != 2000)
        printf(“version 값을 정확히 지적하십시요
“);
    fclose(mdb);
    return 0;
}

윈도우 버전 알아내는 함수

//////////////////////////////////////////////////////////
//  Function Name  
//      GetOSVersionType
//
//  Parameters 
//
//  Return Values
//      설치된 Windows 버전을 return
//      -1: Failed
//      1 : Windows 95
//      2 : Windows 98
//      3 : Windows ME
//      4 : Windows NT
//      5 : Windows 2000
//      6 : Windows XP
static int WINAPI GetOSVersionType() 
{
    UINT nOSVersion;
    OSVERSIONINFOEX osvi;
    BOOL bOsVersionInfoEx;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    
    if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
    {
        osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
        if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
            return -1;
    }
    
    switch (osvi.dwPlatformId)
    {
    case VER_PLATFORM_WIN32_NT:
        // Test for the product.
        if ( osvi.dwMajorVersion <= 4 )
            nOSVersion = 4;
        else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
            nOSVersion = 5;
        else if( bOsVersionInfoEx )  
            nOSVersion = 6;
        break;
    case VER_PLATFORM_WIN32_WINDOWS:
        if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
            nOSVersion = 1;
        else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
            nOSVersion = 2;
        else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
            nOSVersion = 3;
        break;
    }
    
    return nOSVersion; 
}

시작프로그램 레지스트리에 등록/해제 함수

//////////////////////////////////////////////////////////
//  Function Name  
//      SetRegistyStartProgram
//
//  Parameters 
//      bAutoExec[in]     : TRUE이면 시작프로그램 레지스트리에 등록, FALSE면 해제
//      lpValueName[in]   : 설정할 값의 이름
//      lpExeFileName[in] : 실행시킬 프로그램 Full 경로 (NULL 일수 있음, 단, bAutoExec값이 FALSE이여야 함)
//
//  Return Values
//      시작프로그램 레지스트리에 등록/헤제 성공이면 TRUE, 실패면 FALSE     
//
static BOOL SetRegistyStartProgram(BOOL bAutoExec, LPCSTR lpValueName, LPCSTR lpExeFileName)
{
    HKEY hKey;
    LONG lRes;
    if(bAutoExec)
    {
        if(lpValueName == NULL || lpExeFileName == NULL)
            return FALSE;
        if(RegOpenKeyEx( 
            HKEY_LOCAL_MACHINE,
            “SOFTWAREMicrosoftWindowsCurrentVersionRun”, 
            0L,KEY_WRITE,
            &hKey
            ) != ERROR_SUCCESS)
            return FALSE;    
 
        lRes = RegSetValueEx(hKey,
                lpValueName, 
                0,      
                REG_SZ,    
                (BYTE*)lpExeFileName,   
                lstrlen(lpExeFileName)); 
            
        RegCloseKey(hKey);
 
        if(lRes != ERROR_SUCCESS) 
            return FALSE;
    }
    else 
    {
        if(RegOpenKeyEx(
            HKEY_LOCAL_MACHINE,
            “SOFTWAREMicrosoftWindowsCurrentVersionRun”, 
            0, KEY_ALL_ACCESS, 
            &hKey) != ERROR_SUCCESS)
            return FALSE;
 
        lRes = RegDeleteValue(hKey, lpValueName);      
 
        RegCloseKey(hKey);
 
        if(lRes != ERROR_SUCCESS) 
            return FALSE;
    }
 
    return TRUE;
}
 
 
ex >
 
 SetRegistyStartProgram(TRUE, “AAA”, “C:TestA.exe”);    // 등록
 SetRegistyStartProgram(FALSE, “AAA”, NULL);    // 해제

USB 장치 연결/연결해제 이벤트 처리하기

1. 메시지 맵 등록   

메시지 맵에 이벤트를 함수와 연결 시킨다. 

// example 

    BEGIN_MESSAGE_MAP(CDlg, CDialog)
            ON_MESSAGE(WM_DEVICECHANGE, fnDeviceChange)
    END_MESSAGE_MAP()


2. 이벤트를 받을 장치를 등록한다.

장치 등록은 RegisterForDeviceNotifications()함수를 이용한다

 //example
    void CDlg::RegisterForDeviceNotifications()
    {
        DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
        HDEVNOTIFY DeviceNotificationHandle; 

        DevBroadcastDeviceInterface.dbcc_size = sizeof(DevBroadcastDeviceInterface);
        DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
        DevBroadcastDeviceInterface.dbcc_classguid = DeviceGuid;              //해당 장치의 GUID

         DeviceNotificationHandle =
            RegisterDeviceNotification(m_hWnd, &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);
    }

   
3. 처리함수 구현

처리함수는 WM_DEVICECHANGE에서 넘어오는 파라메터를 이용해서 한다. 자세한 파라메터 정보는 MSDN을 참조하시기 바랍니다.

void CDlg::fnDeviceChange(WPARAM wParam, LPARAM lParam)
{
    switch(wParam)
    {
        case DBT_DEVICEARRIVAL:
            //장치 연결 됬을 때 처리
            break; 

        case DBT_DEVICEREMOVECOMPLETE:
            //장치 연결 해제 됬을 때 처리
            break;

         default:
            break;
    }
}