한 2년 전에 Xnote LW20-35WK라는 모델을 약 200만원이라는 거금을 주고 샀습니다. CPU가 2.13GHz에 램이 2GByte 달린 괴물같은 녀석이었지요. ^^;;;; 그때는 노트북 램이 아무리 커도 느린 HDD 때문에 별로 안빠르다는 사실을 몰랐습니다. ㅜ_ㅜ (결국 스펙 오버....)

 세월이 흘러 프로그램들은 점점 더 무거워졌고,  HDD가 느린 LW20으로 버티기엔 무리더군요. 결국 데스크탑으로 갈아타고 노트북은 저쪽 책꽂이 한켠에 던져놨었습니다. 그런데... 다들 아시겠지만 데스트탑이 열이 장난이 아닙니다. ^^;;; 모니터도 24인치짜리를 쓰고있으니 아래에서 위에서 열이 펄펄.... 결국 견디다 못해 노트북을 집었습니다.

 역시나 노트북이 상당히 느리군요. 예전에 어떻게 사용했는지 모르겠습니다. 데스크탑과 비교하면 이건... 뭐... ㅡ_ㅜ... 그래도 열은 안나니 좋긴한데.... ^^;;;;; 어차피 웹 작업 위주니 작업에는 큰 문제가 없지만... 워드나 기타 개발 툴을 실행할때는 죽을 것 같네요. ㅎㅎ

 그래도 열이 확 줄어들어서 좋습니다. ;) 앞으로 글쓸 일이 좀 많아질 듯 한데... 글쓰는 일과 같이 로드가 적게 걸리는 일은 노트북을 쓰고, 큰 로드가 걸리는 부분은 데스크탑을 켜서 원격으로 하는 방법으로 해야겠습니다. 이렇게 되니 안팔기를 잘한 것 같네요. ^^)/~ 사람 마음이란게 참... ㅎㅎ

 아아~ 오늘부로 가상 HID(Virtual HID)관련 작업이 거의 마무리되서, 앞으로 다른 일을 좀 할 수 있을 것 같습니다. 날아갈것 같군요. 앞으로 더 재미난걸 해볼 생각입니다. ;)
 그럼 다들 좋은 밤 보내시길~ ㅎㅎ

몇시간 삽질 끝에 드디어 가상 HID(Virtual HID)를 완성했습니다. ^^)/~ 약간 문제가 있긴 하지만 그래도 동작은 하니... ^^;;;;; 하나의 드라이버로 동작하게 할 생각이었습니다만은 보안 프로그램에 따라 특색이 조금씩 달라서 결국 포기했습니다.

이게 희한한게... 하나는 완전히 내렸다가 새로 올리고 다른 하나는 아예 그냥 잘라버립니다. ㅡ_ㅡa... 이것 참... 그래서 한쪽에 맞춰두면 다른 한쪽에서 문제가 발생하더군요. 결국 두가지 버전으로 구성했습니다. 이렇게 되면 버전관리가 힘든데... 흑흑.... ㅜ_ㅜ 어쩔수 없지요 ㅜ_ㅜ...

대충 키보드/마우스 이벤트를 넣어보고 정리하려고 키보드 쪽을 유심히 봤더니, HID 키보드의 값과 전통적으로 사용하는 스캔 코드(Scan Code)의 값이 서로 다르더군요. @0@)/

결국 기존의 LIbrary가 스캔 코드 값을 받도록 되어있었기에, 호환성 유지를 위해 HID 값으로 바꿔줘야 했습니다. 결국 Mapping Table을 만들어야 한다는 이야기!!! 그래도 구글신이 도와주셔서 괜찮은 문서를 구했고, 삽질 끝에 맵핑 테이블을 완성했습니다. ^^)/~

아아~ 일단 만들었으니 내일 테스트 해야겠습니다. ^^)/~ 다들 좋은 밤 되시길~

translate.pdf
0.13MB

문서와 Mapping Table 첨부합니다. ^^)/~

/*Key Name        PS/2 Set 1 Make*        HID Usage ID */    
{/*    DO NOT USE    0x00    */    0x00    ,
/*    Escape    0x01    */    0x29    ,
/*    1 !    0x02    */    0x1E    ,
/*    2 @    0x03    */    0x1F    ,
/*    3 #    0x04    */    0x20    ,
/*    4 $    0x05    */    0x21    ,
/*    0.05    0x06    */    0x22    ,
/*    6 ^    0x07    */    0x23    ,
/*    7 &    0x08    */    0x24    ,
/*    8 *    0x09    */    0x25    ,
/*    9 (    0x0A    */    0x26    ,
/*    0 )    0x0B    */    0x27    ,
/*    - _    0x0C    */    0x2D    ,
/*    = +    0x0D    */    0x2E    ,
/*    Backspace    0x0E    */    0x2A    ,
/*    Tab    0x0F    */    0x2B    ,
/*    q Q    0x10    */    0x14    ,
/*    w W    0x11    */    0x1A    ,
/*    e E    0x12    */    0x08    ,
/*    r R    0x13    */    0x15    ,
/*    t T    0x14    */    0x17    ,
/*    y Y    0x15    */    0x1C    ,
/*    u U    0x16    */    0x18    ,
/*    i I    0x17    */    0x0C    ,
/*    o O    0x18    */    0x12    ,
/*    p P    0x19    */    0x13    ,
/*    [ {    0x1A    */    0x2F    ,
/*    ] }    0x1B    */    0x30    ,
/*    Return    0x1C    */    0x28    ,
/*    Left Control    0x1D    */    0xE0    ,
/*    a A    0x1E    */    0x04    ,
/*    s S    0x1F    */    0x16    ,
/*    d D    0x20    */    0x07    ,
/*    f F    0x21    */    0x09    ,
/*    g G    0x22    */    0x0A    ,
/*    h H    0x23    */    0x0B    ,
/*    j J    0x24    */    0x0D    ,
/*    k K    0x25    */    0x0E    ,
/*    l L    0x26    */    0x0F    ,
/*    ; :    0x27    */    0x33    ,
/*    ' "    0x28    */    0x34    ,
/*    ` ~    0x29    */    0x35    ,
/*    Left Shift    0x2A    */    0xE1    ,
/*    \ |    0x2B    */    0x31    ,
/*    Europe 1 (Note    0x2B    */    0x32    ,
/*    z Z    0x2C    */    0x1D    ,
/*    x X    0x2D    */    0x1B    ,
/*    c C    0x2E    */    0x06    ,
/*    v V    0x2F    */    0x19    ,
/*    b B    0x30    */    0x05    ,
/*    n N    0x31    */    0x11    ,
/*    m M    0x32    */    0x10    ,
/*    , <    0x33    */    0x36    ,
/*    . >    0x34    */    0x37    ,
/*    / ?    0x35    */    0x38    ,
/*    Right Shift    0x36    */    0xE5    ,
/*    Keypad *    0x37    */    0x55    ,
/*    Left Alt    0x38    */    0xE2    ,
/*    Space    0x39    */    0x2C    ,
/*    Caps Lock    0x3A    */    0x39    ,
/*    F1    0x3B    */    0x3A    ,
/*    F2    0x3C    */    0x3B    ,
/*    F3    0x3D    */    0x3C    ,
/*    F4    0x3E    */    0x3D    ,
/*    F5    0x3F    */    0x3E    ,
/*    F6    0x40    */    0x3F    ,
/*    F7    0x41    */    0x40    ,
/*    F8    0x42    */    0x41    ,
/*    F9    0x43    */    0x42    ,
/*    F10    0x44    */    0x43    ,
/*    Num Lock    0x45    */    0x53    ,
/*    Scroll Lock    0x46    */    0x47    ,
/*    Keypad 7 Home    0x47    */    0x5F    ,
/*    Keypad 8 Up    0x48    */    0x60    ,
/*    Keypad 9 PageUp    0x49    */    0x61    ,
/*    Keypad -    0x4A    */    0x56    ,
/*    Keypad 4 Left    0x4B    */    0x5C    ,
/*    Keypad 5    0x4C    */    0x5D    ,
/*    Keypad 6 Right    0x4D    */    0x5E    ,
/*    Keypad +    0x4E    */    0x57    ,
/*    Keypad 1 End    0x4F    */    0x59    ,
/*    Keypad 2 Down    0x50    */    0x5A    ,
/*    Keypad 3 PageDn    0x51    */    0x5B    ,
/*    Keypad 0 Insert    0x52    */    0x62    ,
/*    Keypad . Delete    0x53    */    0x63    ,
/*    UNASSIGNED    0x54    */    0x00    ,
/*    UNASSIGNED    0x55    */    0x00    ,
/*    Europe 2 (Note    0x56    */    0x64    ,
/*    F11    0x57    */    0x44    ,
/*    F12    0x58    */    0x45    ,
/*    Keypad =    0x59    */    0x67    ,
/*    UNASSIGNED    0x5A    */    0x00    ,
/*    UNASSIGNED    0x5B    */    0x00    ,
/*    Keyboard Int'l 6    0x5C    */    0x8C    ,
/*    UNASSIGNED    0x5D    */    0x00    ,
/*    UNASSIGNED    0x5E    */    0x00    ,
/*    UNASSIGNED    0x5F    */    0x00    ,
/*    DO NOT USE    0x60    */    0x00    ,
/*    DO NOT USE    0x61    */    0x00    ,
/*    UNASSIGNED    0x62    */    0x00    ,
/*    UNASSIGNED    0x63    */    0x00    ,
/*    F13    0x64    */    0x68    ,
/*    F14    0x65    */    0x69    ,
/*    F15    0x66    */    0x6A    ,
/*    F16    0x67    */    0x6B    ,
/*    F17    0x68    */    0x6C    ,
/*    F18    0x69    */    0x6D    ,
/*    F19    0x6A    */    0x6E    ,
/*    F20    0x6B    */    0x6F    ,
/*    F21    0x6C    */    0x70    ,
/*    F22    0x6D    */    0x71    ,
/*    F23    0x6E    */    0x72    ,
/*    UNASSIGNED    0x6F    */    0x00    ,
/*    Keyboard Intl'2    0x70    */    0x88    ,
/*    UNASSIGNED    0x71    */    0x00    ,
/*    UNASSIGNED    0x72    */    0x00    ,
/*    Keyboard Int'l    0x73    */    0x87    ,
/*    UNASSIGNED    0x74    */    0x00    ,
/*    UNASSIGNED    0x75    */    0x00    ,
/*    F24    0x76    */    0x73    ,
/*    Keyboard Lang 4    0x77    */    0x93    ,
/*    Keyboard Lang 3    0x78    */    0x92    ,
/*    Keyboard Int'l4    0x79    */    0x8A    ,
/*    DO NOT USE    0x7A    */    0x00    ,
/*    Keyboard Int'l5    0x7B    */    0x8B    ,
/*    DO NOT USE    0x7C    */    0x00    ,
/*    Keyboard Int'l2    0x7D    */    0x89    ,
/*    Keypad ,Brazilian Keypad    0x7E    */    0x85    ,
/*    DO NOT USE    0x7F    */    0x00    }

 오늘 무슨 행사를 한다길래 그냥 앉아 있으면 되는 줄 알고 어제 2시까지 코드를 만지다가 잤습니다. ㅡ_ㅡa... 아 이거 원... 거의 다 됬는데 진짜 한끗 차이로 모 보안 프로그램에 걸리더군요. ^^;;; 사실 걸린다는 표현보다는 이녀석이 HID Keyboard Driver를 내려버린다는 말이 더 맞는 것 같습니다. 그래서 키보드 입력이 안되는 문제가.... ^^;;;;

 그래서 이걸 해결하려고 이것 저것 손보다보니 2시 넘어서 잤습니다. 그래도 일은 안하니까 좀 편한 마음으로 잤지요. 그런데 이게 왠일입니까? 노가다를 시키는 것이 아니겠습니까? ㅜ_ㅜ)/~ 아흑... 잠도 별로 못잤는데 땀 뻘뻘 흘리면서 이상한 걸 했더니 나중에는 머리가 다 아프더군요. 지금도 지끈 거리는 상탭니다. ㅜ_ㅜ....

 불행은 이 상태에서 다시 코드를 보고 있다는 것이고, 그나마 다행인 점은 칼퇴근을 해서 좀 쉬었다는 겁니다. ㅎㅎ 아유... 진짜 머리 아프네요. ^^;;; 당췌 어떻게 해야 해결할 수 있을지....

 오늘도 열심히 한번 파봐야겠습니다. 뭐라도 나오겠지요 ^^)/~
 그럼 다들 좋은 밤 되시길~


 흑흑... 이게 얼마만인지 모르겠습니다. ㅜ_ㅜ)-b 쌩판 모르는 상태로 HID 드라이버를 손보기 시작해서 키보드와 마우스를 생성하기까지 한참 걸렸고, 보안 프로그램에 걸려서 이걸 피해 가는데 또 한참 걸렸네요.

 ㅜ_ㅜ 아아~ 진짜 ㅡ_ㅡa... 간단히 쓸 수 있는 API를 막아놔서 다른 방법을 찾는다고 고생했습니다.  ㅜ_ㅜ 제가 아는 범위에서 테스트 안해본 케이스가 거의 없을 정도로 오만가지를 다 썼는데... 결국 간단한 아이디어로 해결... ^^;;; 그것도 놀다가 깜짝 떠올라서... ㅎㅎㅎ(역시 인생은 타이밍~!!!). 아이디어는 어쩔 수 없이 비공개... 왠지 하면 큰일날듯해서 ^^;;;;;

 가상 HID 드라이버가 HID miniport 드라이버이다 보니 이것저것 제약사항이 많더군요. 뭐 하나 제대로 할 수 있는 것도 없고... 툭하면 재부팅되기 일수이고... 평일 저녁시간과 주말 일부를 올인해서 겨우 해결했습니다. 방금 테스트했는데 큰 문제가 없는 것 같네요. ^^)/~~~

 이제 더러워진 드라이버 코드를 좀 정리하고, 약간 테스트만 더하면 끝날 것 같습니다. 어휴~ 이번 주는 따로 스케줄이 있어서 내일 말고는 시간이 없을 듯한데, 내일 저녁에 완전히 끝내 놓야겠군요. ^^;;;; 어휴... 죽는 줄 알았습니다. 어휴~ 진짜... @0@)/~!!!

 덕분에 HID에 대해서 공부 한번 제대로 했습니다(정말? ㅡ_ㅡa..). 역시 DDK만한게 없군요. 최고입니다. ㅎㅎ DDK 만세~~
 그럼 다들 좋은 밤 되세요 ;)

ps) 이런... ㅡ_ㅡa... 한쪽은 또 다른 수를 써놓았군요. ㅡ_ㅡ;;; 좀 더 파봐야 할 것 같습니다. ㅜ_ㅜ 아우~ 진짜... ㅜ_ㅜ)/~

 아아~ 역시 이거 USB가 만만치 않군요. ㅜ_ㅜ... 잘 모르는 상태에서 시작했던 USB 개발이라... 막히니 해결하는데 시간이 많이 걸리네요. ㅜ_ㅜ...

 가상 USB의 특성상(Bus 드라이버 같은거다보니... ^^;;;) USB API로 드라이버를 찾게되면 맨 상단에 위치한 드라이버가 나오게 되는데... 이걸 직접 찾아서 Open 하려니 드라이버가 또 필요할 것 같고...

 지금 고민에 빠져있는 상태입니다. 일단 간단히 메시지를 보낼 방법을 찾았지만 생각보다 문제가 많더군요. ㅡ_ㅡa... 그래서 결국 다른 방법을 찾아야겠는데... 아아... 이거 원... ^^;;; 결국 드라이버를 하나 더 써야할지...
 
 어찌하면 좋을까요? ㅜ_ㅜ
 좋은 생각 있으신 분 계시나요?


 과로로 며칠 쉬다가 겨우 다시 작업 중입니다. 가상 HID(Virtual HID) 드라이버는 대충 완성됬는데... 글쎄 또 보안 프로그램이 문제군요. ㅡ_ㅡa... 이것 참.... 답답하네요. ㅎㅎ

 다시 오늘부터 열혈 디버깅 들어갑니다. 삽질하다보면 삽이 부러지던지 바닥을 뚫던지 결판이 나겠지요. ;) 아우~ 이거 신경질이 살살 납니다. 이래서야 원... 뭘 할수가 있어야.... 다 만들어 놓고도 써먹질 못하니... ^^;;;;

 이제 또 누가 이기나 해봐야겠군요. ㅎㅎ >ㅁ<)-b

 분석해서 나중에 또 올리겠습니다.

 그럼 다들 좋은 밤 되시길~ ;)


 아흑... 요즘 뜨는 대세가 가상 HID(Virtual HID)라고 해서 잘 모르는 USB Spec을 뒤지면서 작업을 하고 있습니다. 어휴... 이것 참 진짜 어렵네요. ㅜ_ㅜ...

 그래도 어떻게 어떻게 진행해서 키보드와 마우스로 인식시킨 다음 마우스 데이터를 밀어넣는데 성공했습니다. >ㅁ<)/~ ㅎㅎ 신나는 군요. ;)

 HID Report 구조체를 보면서 발견한건데, Mouse의 좌표 값이 상대값이네요. 하긴... 절대값으로 들어올려면 마우스가 지금 어디에 있었고 얼마만큼 움직였는지 알아야하니까 당연히 상대값으로 가는게 맞겠지요. ^^;;;;

 아휴~ 머리를 썼더니 골치가 다 아픕니다. ^^;;; 이거 원... 취미생활은 하나도 못하고 계속 작업만 하고 있군요. ㅜ_ㅜ)/~ 빨리 마무리해야겠습니다.

 그럼 다들 좋은 밤 되시길~ ;)

+ Recent posts