Windows에서 사용되는 DOS 커서 설정하는 것은 꼭 Hexa Code Editor을 만들기 위해서 사용되는 방법이 아니다.


 단, 이걸 이용해서 DOS의 커서를 설정해야지만이 TUI을 제작할 수 있기 때문에 기록하는 것이다.


 DOS의 커서를 설정하는데 사용되는 함수는 setConsoleCursorPosition[각주:1]이라는 함수이다.


 이 함수를 이용하면, 만들어지고, 어셈블리어를 설정하면, 또다른 방법으로 TUI을 설정할 수 있다.(이것은 나중에 찾아봐야겠다.)


 예제)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
#include <windows.h>
 
int main()
{
    COORD coord;
 
    coord.X = 10;
    coord.Y = 20;
 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
 
    printf("Hello world!\n");
    
    return 0;
}
 
 
cs


 여기서 COORD[각주:2]라는 구조체가 필요하게 된다.

 여기서 coord라는 녀석은 콘솔의 X, Y의 값을 저장하는 구조체가 있다.

 GetStdHandle()[각주:3]은 콘솔의 핸들러를 받아서 처리하는 것이다.

 STD_OUTPUT_HANDLE이라는 것은 기본적으로 설정되어 있는 핸들이다.


 여기 핸들의 정보는 각주를 참조하는게 좋을 것으로 생각한다.

Posted by JunkMam
,

 Hexa Code Editor 필자는 바이너리 에디터라고 말하는 에디터는 파일의 내용물을 이진 파일 입출력을 이용해서 불러와서 내용물을 보는 편집기를 말한다.


 컴퓨터의 모든 프로그램은 바이너리 데이터들을 책처럼 나열해 놓은 형태이다.

 

 예을 들어서 EXE 파일이나, JPEG, PNG 등의 모든 파일들은 바이너리 입출력으로 처리되며, 이 파일의 형태에 맞춰서 읽어 들인다.

 EXE. 즉, 실행 파일조차도 COFF에 맞춰서 사전처럼 읽어 들이고, 쓰게 되어있다.


 이걸 이용해서 바이러스파일이나, 기타 파일을 분석하거나 수정을 가할 수 있는 방식이라고 생각하면 된다.

 쉽게 분석할려면, 이 Hexa Code Editor을 수정해서 CPU에서 읽어들이는 형태(어셈블리어)를 자동으로 변환 시켜주는 틀을 만들어야되지만, Hexa Code Editor는 그 뿐만 아니라, 다른 파일들도 분석할 수 있기 때문에 다양하게 사용될 수 있다.


 옛날에는 게임의 저장 파일을 수정해서 에디팅을 하기 위해서 사용되었다.


 그럼, 이렇게 다양하게 사용할 수 있는 툴을 만들어 보고자 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
 
#include <windows.h>
 
#define BUFFER_SIZE 16
 
int main()
{
    FILE *fp = NULL;
 
    char buff[BUFFER_SIZE] = {0};
    long offset = 0;
    int read = 0;
    int num = 0;
 
    fp = fopen("./a.exe","rb");
 
    if(fp == NULL) return -1;
 
    while((read = fread(&buff,sizeof(char),BUFFER_SIZE,fp))!=0){
        printf("%.10X : ",offset);
 
        for(num = 0; num < read; num++){
            printf("%.2X ",buff[num]&0xFF);
        }
        offset+=read;
 
        printf("\n");
    }
 
 
    fclose(fp);
 
    return 0;
}
 
 
cs


 이렇게 하면, a라는 파일의 내용물을 출력하게 된다.

 이 출력된 데이터는 Hexa로 출력되기 때문에, Hexa Code Editor 혹은 Hexa Edit/ Hex Edit라고 한다.


 여기서 중요한건, 바이너리(이진)으로 입출력해야된다.

 그렇게 하지 않으면, 입출력을 문자로 처리하기 때문에, 영어권 외의 곳에선 1Byte 이상의 데이터를 읽어들여서 출력하게 된다.(줄 바꿈또한 1-2Byte을 사용하게 된다.)

 이렇게 되면, 문제가 있기 때문에 fopen([파일명],"rb");을 이용해야된다.

'연습' 카테고리의 다른 글

Hexa Code Editor 만들기 -키보드 입력 인식-  (0) 2015.11.24
Hexa Code Editor 만들기 -Windows에서 DOS 커서 이동.-  (0) 2015.11.23
CodeBlocks 설치 및 설정하기.  (0) 2015.11.17
XWRT 문제점...  (0) 2015.11.15
GAR --Help  (0) 2015.11.11
Posted by JunkMam
,

 Code::Blocks란, C언어 및 포트란 등을 지원하는 오픈 소스의 크로스 플렛폼 IDE(통합 개발 환경)이다.(Free Software이다.)



 


  ↑ Code::Blocks을 다운 받는 곳


 Code::Blocks는 크로스 플렛폼이기 떄문에, 리눅스, 윈도우등에 사용이 가능하다.

 그리고 wxWidget이라는 클로스 플렛폼 GUI 라이브러리가 있어서 리눅스, 윈도우등의 소스를 한번에 제작이 가능하다.(단, 이것 또한 가상머신과 유사하게 돌아가는 방식이기 때문에, 유포할 경우, DLL 파일을 같이 넣어서 유포해줘야된다.)


 IDE(통합 개발 환경) 이기 때문에, 컴파일 장치로 보는게 맞지 않다.

 그래서, 컴파일러를 깔아야된다.


 Code::Blocks의 본 사이트에선 Downloads에서 MinGW랑 같이 설치 할 수 있게 되어 있다.


 그냥, 설치할 사람은 그걸 이용해서 설치하길 바란다.


 그게 아닌 사람들은, MinGW을 다운 받는다.


 MinGW 64Bit 다운받는 곳


 다운 받은 후에 설치를 한다.


 설치는 따라 맞춰서 설치하면 된다.


 


 맨 처음 열었을때, 이런 창이 뜻 것이다.

 여기서Settings -> Compiler을 클릭한다.



 이런 창이 뜨게 되는데, 이 창에서 Tollchain executables이라는 탭을 클릭한다.



 클릭하면, 이렇게 창이 뜨게되고, Compiler's installation directory 설정에서 파일을 찾게한다.

 이렇게하면, 파일을 설정되는데, MinGW의 bin파일이 기본적으로 설정되어 있고, 거기서 컴파일인 gcc와 g++, gfotran등 기본적인 프로그래밍 언어 컴파일러가 존재하며, 그 외도 as(GNU as)와 ar등의 툴까지 같이 있다.


 이것까지 제대로 설정이 되어 있으면, Code::Blocks의 설정이 끝난다.

'연습' 카테고리의 다른 글

Hexa Code Editor 만들기 -Windows에서 DOS 커서 이동.-  (0) 2015.11.23
Hexa Code Editor 만들기 -이진 파일 출력.-  (0) 2015.11.22
XWRT 문제점...  (0) 2015.11.15
GAR --Help  (0) 2015.11.11
GCC --help  (0) 2015.11.10
Posted by JunkMam
,

base64 -1 : base64 응용 -

연습 2015. 10. 4. 13:18

 base64는 파일의 구성을 256가지가 아닌 64가지로 표현하는 방법이다.


 그래서 파일의 내용은 그대로 남아있다는 특징을 가진다.


 Decoder만 존재한다면, 해당 파일을 어떻게든 얻을 수 있다는 뜻이다.(깨져있을 수 있다는 점은 제외)


 예을 들어서 이미지 파일을 표현하고자 한다고 하자.


 보통 html로 이미지를 불러온다면, 다음같은 소스를 사용한다.


 


 <img src="이미지 파일 경로" />


 여기서 src을 '이미지 파일 경로'로 처리하는게 아니라.


 base64로 얻어진 파일 경로를 사용한다.(Data URI)


 그렇게하면, 서버에 파일데이터를 데이터베이스 문서파일로 넣을 수 있게 된다.


 예제:

 이미지파일을 base64로 변경시킨 값.


 base 64:

R0lGODlhYAATAPcAAAAAAP///0BDSj9CSj5BST1ASDw/Rjo9RTg7Qjg6Qjc6Qk9CQ0w/QUtAQkU9

QE1ESEM8QElCRkdCRkVDSTs7Qbm5vMDAw+Pj5dPT1c7O0Pr6+/j4+fPz9PHx8u/v8O3t7ujo6ebm

5+Hh4t3d3mBhaHV2fISFioOEiZCRlouMkYqLkIiJjkVHT0dJUUZIUExOVo+QlK+wtKanq6SlqaGi

pp6fo1FTWlZYX1tdZF5gZ11fZlxeZWRmbTk8RDs+Rjw/R0NGTkJFTUlMVEhLU1haYFtdY2VnbW9x

d2xudGpscnZ4fnJ0eoGDicXGycLDxsHCxby9wLq7vrm6vbe4u7a3urO0t7Gyta+ws6qrrqiprGdp

bnByd3FzeHp8gYuNkoiKj4eJjoWHjISGiz5BSEVIT0dKUU5RWE1QV1FUW09SWVJVXFhbYldaYUFE

SkRHTUxPVUpNU05RV1NWXF9iaF5hZ2Jla2hrcWtudIGDh3+BhZGTl4yOkp+hpZianpWXm9fY2tXW

2NPU1s/Q0s7P0c3O0MnKzMjJy8fIysTFx7/AwlteY2VobW5xdpqcn6yusaaoq+rr7OPk5eHi49/g

4drb3NHS08/Q0fP09Orr6+jp6f/9/P7y7e9kM+9rPfF3TPKCW/WggutTIOtVIexVIuxWI+xXJOxY

JehWJdxRI+1YJt9UJdZRJO1bKe5cKu1cK9JRJs1PJu5eLepcLM5RJ+9fLtVVKe9gL+RcLudfMO1i

MtdYLu9kNNpbMdxdMshULtNZMbZMKsNTLu9nOdZcM7BMK+9pO/BsP7VSMrBPMe9vRPBxRr1YN6BL

MPB0SrdWOPF/WZhPOPGAWvKDXfKIZPOLaPOMafOWdvWjh/WkiPewmPe2oPi+qvjEsvrLu/rNvvzk

3Pzm351IL6lUOqNROJZKM4hGM49PPYNIOIVLOv739X1ENYdOP3VDN29DOHlKP3dMQf/7+mRFP2ZJ

RF0/O19DQFE+PVdFRf39/fj4+Pb29vT09O/v7////wAAAAAAAAAAACH5BAEAAPwALAAAAABgABMA

AAj/AAUIHEiwoMGDCBMqXMiwYcEBECNClCdumC1buJatmyCxo8ePIEOKHEmy5ANnF1Om7PWupMuX

MGNGJECTpj1etHLq3EnLXM2fQIMGFWLEjNCjBF4YKYq0qdMCUAtI+BWrqtWrVt1FhcokgNevAWYU

yOR1DtQ1T75OMhsD7FclUHkYAkvoSNQhbjcgwlFAkFcZUI941Tdk69ZxVql1iuXpUyxh1DhVvRVh

a1e3YceWLXDGg1sNa9pihvtFA+YAfaDixaxvTQmvkAYUoPLXsIHbC2S1agUqADhj8AJI8xZg2+5W

0G7fXmTFiukAUax0MQDCKx0DfryG0CPJKxY8VhJ5/83XnE6Se14/XMES6WseA2W8arAy4msUA5S8

ciGDL4CGOMoFaAA6x1WTTje7gLOJMtlocs1xugh4mz5eyaFcdQFch4VXVxiARHN73EaHVyAoF4hX

lpBxWxtQeIXJGPEFoM9tSHjVgQF4eFVBGF5ZIaFyx7Ai5JBEFinkAhJSGICFt2F4XRde3ePIGwKO

GECJBtgQJREBwqFkEjHOaMAY8o0ZQgD4nHgPlz8a4IuRrnyzSTJGshJPkhVeaN1tVXyFTxZUikji

bYx4NYKEaQWwQphZ0uBVJbftARYUP/pgaTCpZKppMcFFo+mn9Fgqqg+XeKWGqBjmIOodJ3oViQ2W

5v9AoqVbGDqqpU14BUYLp93DiKVBeOZVHbdaesCxyHyqaTPPKKtpA8dGe0CpAaARLYY6SHvAESJ4

VcWxOpB4bBpRpiEtEMLa4QJmgywhbQ1eDaLtvOeYYu+9rGjDTS733lvLvNN6Ze2x2B5QiVdiHKCE

V4CAK+6xgHh1CBDH/tBnAJj8sG4A+UQcAAraeuGVFAAf0MPJDJxSysorC+PVNCyzTM7JNJ9MrQ00

Y7hDD1N4JcIXGHjlxMk7kEgzEugFcMEjfPzxlQk9sODVJWzk418SNacwcs01I+A1AsyQIvbY1mDD

ythiq+LA12xz4FUaX2OoCAJaJA3WFl4rQiLbMNij/dU9jXjthlccILCCV/uc8bUKOrLNdgKQJwDB

LKNUbvnllrMT+eYJuB2AGZFjWATkJXSL+AmRF0Ei51oUYncGJEQ+eAAcQG6BVxgYADnjAVTA+e+Q

1/OKKMQXb7wo5QCv/PI3kBD78sDr8Dz01CvvOAIOEBPK9txvv0o714cv/vjkl2/++V4roP766s8T

DizbowKMOhSwb//9+Oev//78949/QAA7


 이렇게 되어있을걸 그대로 html에 사용하면, 안된다.


 앞에 어떤 데이터인지 제대로 명시해주어야된다.


 현재 Tistory 로고는 gif구조이다.


 그래서 data:image/gif;을 앞에 붙여줘야된다.


 그리고, base64로 구성된것이다. 라고 알려 줘야된다.


 처음 부분은 이렇게 된다.

 data:image/gif;base64,R0lGODlhYAATAPcAAAAAA...


 적용하면, 다음과 같다.

 


 이걸 응용하여, 데이터를 주고 받거나 다운 받을 수도 있다.

 예제


 이렇게하여 데이터를 인터넷에서 다운로드, 저장, 공유를 할 수 있게 된다.


 단, 안전성에서 완벽하다. 라고 할 수는 없을 것이다.(전송 중 1bit가 오류났을 경우, 정정할 수 없으며, 오류를 탐지할 수도 없다.)


 이것만 제외하면, 파일을 글로 저장하여 쓸 수 있게 된다.

 인쇄물을 읽어서 컴퓨터에게 전송 할 수 있는 기술이 있다면, base64로 만든 인쇄물을 이용해서 보관 할 수도 있을 것이다.(그럴 필요성은 없겠지만...)

'연습' 카테고리의 다른 글

- 정리 - SIGMA TV Ⅱ ver 3.20  (0) 2015.10.17
Google Brotli - Brotli.exe -  (0) 2015.10.06
base64 - 0 : 이론 -  (0) 2015.10.03
OpenCL 프로그래밍 공부 -시작-  (0) 2015.10.02
CSS3 -3D Flip Animation-  (0) 2015.09.30
Posted by JunkMam
,

base64 - 0 : 이론 -

연습 2015. 10. 3. 23:15

 base64란, 컴퓨터가 표현하고 있는 문자 방식(1byte로 표현할 수 있는 최댓값)은 256가지이다.


 하지만, 이런 경우를 생각해보자.


 문서(문자열로만 구성된 파일)을 보내는데, 대상이 문서로 표현할 수 없는 데이터로 이루어 져있다면, 어떻게 보낼 것인가?


 여기서 모든 플랫폼에 서로 대응하는 형태를 가져야될 것이다.


 이것을 64가지(숫자, 알파벳 대/소문자, 기타 기호 몇개)로 표현하는 방식이다.


 이 방식의 문제점은 용량의 증가가 존재한다는 문제가 있다.(약 33%가량이 증가한다고 한다.)


 이 방식은 메일 및 기타 방식에 사용되며, 암호와는 전혀 관계가 없다.


 그냥 인코딩하는 것이다. 암호는 알고리즘과 키가 밝혀졌을때, 최대한 그 암호 문서를 늦게 풀어내는 것이 목적이다.(공개키) 하지만, Base64는 남에게 숨길려고 드는 목적을 가지고 있지 않다.


 심지어, Base64는 키라는 존재도, 특정한 존재에게만 열리도록 목적을 가지고 있지 않다.


 1. Base64는 암호용 알고리즘이 아니다.


 그렇다고 Base64가 암축용으로 만들어진 것도 아니다. 오히려 용량이 늘었으면 늘었지(256가지로 표현된 데이터를 64가지로 표현하기 때문에 늘어날 수 밖에 없다.) 줄어들 경우는 없다.


 2. Base64는 압축용 알고리즘이 아니다.


 그렇다면, 왜 Base64가 존재하는가?


 그것은 쉽게 이렇게 들수 있다.


 파일은 올릴 수 없고, 게시판에 이미지 파일을 올려야 될 경우에.

 Base64을 이용하면, 쉽게 사용이 가능하다.


 Base64와 HTML5을 이용한 비디오 출력


 다음과 같은 효과를 얻을 수 있으며, 음악, 사진, 동영상, 파일등 모두다 가능하다.


 그 외에도 메일(MIME)에도 사용이 가능하다.

'연습' 카테고리의 다른 글

Google Brotli - Brotli.exe -  (0) 2015.10.06
base64 -1 : base64 응용 -  (0) 2015.10.04
OpenCL 프로그래밍 공부 -시작-  (0) 2015.10.02
CSS3 -3D Flip Animation-  (0) 2015.09.30
ffprobe 사용법 -영상 정보 보기-  (0) 2015.09.30
Posted by JunkMam
,

이 책을 사서 공부 할려고 한다.
이책에선 Windows 7이 기준이며, 2012년도 라이브러리만 설명이 되어 있어서 최근 설명이 부족하지만, 이 책을 참조하면서 분석하면 될 것 같다.

이 책에서 설명하는 대로 찾아서 설치는 되지만, 차이가 많이 난다.

Intel에서는 INDE라는 녀석이 되어있고(책에선 Intel SDK for OpenCL Application이다.)

CUDA도 조금 다르다.


하지만, 애플, AMD, NVIDIA, intel등을 한번에 정의해서 적어 둔것이기 때문에 쓸만 할 것 같다.

'연습' 카테고리의 다른 글

base64 -1 : base64 응용 -  (0) 2015.10.04
base64 - 0 : 이론 -  (0) 2015.10.03
CSS3 -3D Flip Animation-  (0) 2015.09.30
ffprobe 사용법 -영상 정보 보기-  (0) 2015.09.30
ffmpeg 사용 -mp4 to webm convert(mp4을 webm으로 변환)-  (0) 2015.09.29
Posted by JunkMam
,

 분석하였을때, swipe과 tap은 분석이 되었으나, 다중 터치에 대해서는 언급이 되어 있지 않았다.


 다중 터치를 처리 하기 위해선 먼저 터치가 시작되었다는 정보를 보내야된다.

 0003 0039 로 터치가 시작되었다는 정보가 일어난 후에

 tap이나 swipe과 동일하게, 작업을 하는데, 차이점은

 0003 002f 00000000이라는 정보가 종료 지점에서 넣게 된다는 점이다.

 이것은 다중 터치에서 일어난다.


 예을 들어서 다음과 같게 된다.


 0003 002f 00000000

 0003 0039 00000001

 0003 0035 0000000f

 0003 0036 00000001

 0003 0030 00000002

 0003 003a 00000002

 0000 0000 00000000


 이렇게가 바로 하나의 터치 인식이라는 것이다.

 여기서 다음 터치를 넣기 위해선

 

 0003 002f 00000001

 0003 0039 00000001

 0003 0035 0000000f

 0003 0036 00000001

 0003 0030 00000002

 0003 003a 00000002

 0000 0000 00000000


 이런식으로 인식이 된다는 점이다.


 간단하게 말해서

 002f는 터치의 갯수이고, 0039는 터치의 횟수, 0035 : X축, 0036 : Y축가 되는 것이다.

Posted by JunkMam
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif
 
#include <tchar.h>
#include <windows.h>
 
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_LINE 4096
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("ADB 연결 장치");
 
//프로세스를 위한 변수
HANDLE write_in, write_out;
HANDLE read_in, read_out;
 
SECURITY_ATTRIBUTES sec;
 
long unsigned int writen=0;
long unsigned int readn=0;
 
int rtv;
 
char command[80= {0,};
char buffer[MAX_LINE];
 
STARTUPINFO si={0,};
PROCESS_INFORMATION pi;
 
int x=0;
int y=0;
 
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           szClassName,       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 00))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i=0;
 
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            sec.nLength=sizeof(SECURITY_ATTRIBUTES);
            sec.bInheritHandle=TRUE;
            sec.lpSecurityDescriptor=NULL;
 
            CreatePipe(&write_out,&write_in,&sec,0);
            CreatePipe(&read_in,&read_out,&sec,0);
 
            sprintf(command,"./adb.exe shell",NULL);
 
            si.cb=sizeof(STARTUPINFO);
            si.hStdInput=write_out;
            si.hStdOutput=read_out;
            si.dwFlags=STARTF_USESTDHANDLES;
 
            rtv=CreateProcess(NULL,
                            command,
                            NULL,
                            NULL,
                            TRUE,
                            NULL,
                            NULL,
                            NULL,
                            &si,
                            &pi);
 
            if(!rtv){
                printf("Error");
                PostQuitMessage (0);
            }
            sprintf(buffer,"sendevent /dev/input/event2 3 57 1\n");
            WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
            printf("%s",buffer);
 
 
            break;
        case WM_KEYDOWN:
            switch(wParam){
                case VK_UP:
                    y++;
                    x++;
                    sprintf(buffer,"sendevent /dev/input/event2 3 53 50\n",x);
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    sprintf(buffer,"sendevent /dev/input/event2 3 54 %d\n",y);
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    sprintf(buffer,"sendevent /dev/input/event2 3 48 2\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    sprintf(buffer,"sendevent /dev/input/event2 3 58 5\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    sprintf(buffer,"sendevent /dev/input/event2 0 0 0\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    /*
                    strcpy(buffer,"sendevent /dev/input/event2 3 57 -1\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    strcpy(buffer,"sendevent /dev/input/event2 0 0 0\n");
                    WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
                    printf("%s",buffer);
                    */
                Sleep(250);
                default :
                    printf("%d",wParam);
                    break;
            }
            /*
            for(i=0;i<MAX_LINE;i++){
                buffer[i]=0x00;
            }
            ReadFile(read_in,buffer,sizeof(buffer),&readn,NULL);
            printf("%s",buffer);
            */
            break;
        case WM_DESTROY:
            strcpy(buffer,"exit\n");
            WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
            printf("%s",buffer);
 
            CloseHandle(write_in);
            CloseHandle(write_out);
            CloseHandle(read_in);
            CloseHandle(read_out);
            CloseHandle(pi.hProcess);
 
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
 
 
cs


Posted by JunkMam
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
0003 002f 00000000//0번째 터치
 
0003 002f 00000001//1번째 터치
 
//sendevent 설정
sendevent /dev/input/event2 0 0 0
 
- tap
0003 0039 00003c4a
0003 0035 00000133
0003 0036 00000154
0003 0030 00000022
0003 003a 00000005
0000 0000 00000000
0003 0039 ffffffff
0000 0000 00000000
 
 
- swipe
0003 0039 00003c4c
0003 0035 0000003a
0003 0036 00000136
0003 0030 00000016
0003 003a 00000002
0000 0000 00000000
0003 0035 00000056
0003 0036 00000120
0003 0030 00000021
0000 0000 00000000
0003 0035 00000066
0003 0036 00000117
0003 003a 00000004
0000 0000 00000000
0003 0035 0000007a
0003 0036 0000010e
0000 0000 00000000
0003 0035 00000088
0003 0036 00000106
0000 0000 00000000
0003 0035 0000009a
0003 0036 000000fe
0003 003a 00000006
0000 0000 00000000
0003 0035 000000a7
0003 0036 000000f9
0003 003a 00000004
0000 0000 00000000
0003 0035 000000bf
0003 0036 000000f2
0003 003a 00000005
0000 0000 00000000
0003 0035 000000ce
0003 0036 000000ef
0003 003a 00000004
0000 0000 00000000
0003 0035 000000dc
0003 0036 000000ec
0000 0000 00000000
0003 0035 000000eb
0003 0036 000000eb
0000 0000 00000000
0003 0035 000000f9
0003 003a 00000003
0000 0000 00000000
0003 0035 0000010c
0003 0036 000000ef
0003 003a 00000004
0000 0000 00000000
0003 0035 0000011c
0003 0036 000000f5
0003 003a 00000006
0000 0000 00000000
0003 0035 0000012a
0003 0036 000000fd
0003 003a 00000005
0000 0000 00000000
0003 0035 00000136
0003 0036 00000105
0003 003a 00000004
0000 0000 00000000
0003 0035 00000140
0003 0036 0000010f
0000 0000 00000000
0003 0035 0000014a
0003 0036 0000011a
0000 0000 00000000
0003 0035 00000153
0003 0036 00000127
0000 0000 00000000
0003 0035 00000158
0003 0036 00000133
0000 0000 00000000
0003 0035 0000015d
0003 0036 00000141
0003 003a 00000005
0000 0000 00000000
0003 0035 00000162
0003 0036 00000153
0003 003a 00000004
0000 0000 00000000
0003 0035 00000163
0003 0036 00000161
0003 003a 00000005
0000 0000 00000000
0003 0035 00000164
0003 0036 00000171
0003 003a 00000004
0000 0000 00000000
0003 0035 00000163
0003 0036 0000017f
0000 0000 00000000
0003 0035 0000015e
0003 0036 00000192
0003 003a 00000003
0000 0000 00000000
0003 0035 00000154
0003 0036 000001a6
0003 003a 00000002
0000 0000 00000000
0003 0035 00000144
0003 0036 000001b5
0003 003a 00000004
0000 0000 00000000
0003 0035 0000012e
0003 0036 000001c9
0000 0000 00000000
0003 0035 00000119
0003 0036 000001d7
0000 0000 00000000
0003 0035 00000103
0003 0036 000001e2
0000 0000 00000000
0003 0035 000000e8
0003 0036 000001f1
0000 0000 00000000
0003 0035 000000d3
0003 0036 000001ff
0003 003a 00000002
0000 0000 00000000
0003 0035 000000bd
0003 0036 00000209
0003 003a 00000004
0000 0000 00000000
0003 0035 000000aa
0003 0036 0000020e
0003 003a 00000002
0000 0000 00000000
0003 0035 000000a1
0003 003a 00000004
0000 0000 00000000
0003 0035 00000090
0003 0036 0000020c
0003 0030 0000000d
0003 003a 00000001
0000 0000 00000000
0003 0039 ffffffff
0000 0000 00000000
 
 
cs


여기서 본다면, 

이벤트는 총 3형태로 입력을 받는다는걸 알 수 있다.

첫번째열인 0003과 0000에서

0003은 터치레 관련된 걸 뜻하는 것 같고,

0000은 시스템적으로 종료를 뜻하는 것 같다.

0039는 터치의 시작을 뜻하는 것인 것 같고

00003c4a와 00003c4c는 터치의 횟수이다.

002f는 터치의 갯수의 종료를 뜻하는 거라고 알 수 있을것이다.

다중 처리 방법으로 처리 할 수 있을 것이다.(ZoomIn/Out)


기본적으로


1
2
3
4
5
6
7
8
9
10
0003 0039 00003c4a // tap 시작
0003 0035 00000133 // x 혹은 y
0003 0036 00000154 // x 혹은 y
0003 0030 00000022 // Prs
0003 003a 00000005 // 
0000 0000 00000000 // 입력
0003 0039 ffffffff // 터치 종료
0000 0000 00000000 // 입력
 
 
cs


이런 형태이고, 이걸 응용하여, 값을 측정 해 낸다.

Hex값이기 때문에, 3c4a같은 건 횟수에서 꽤 많은 터치가 있었다는 뜻이 된다.

0x35는 X축 0x36 Y축의 값을 처리하게 되어있고, 0x30은 Prs의 Size 뜻이다.(면적)

0x3a는 Prs를 뜻하게 된다.

Posted by JunkMam
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif
 
#include <tchar.h>
#include <windows.h>
 
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_LINE 4096
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("ADB 연결 장치");
 
//프로세스를 위한 변수
HANDLE write_in, write_out;
HANDLE read_in, read_out;
 
SECURITY_ATTRIBUTES sec;
 
long unsigned int writen=0;
long unsigned int readn=0;
 
int rtv;
 
char command[80= {0,};
char buffer[MAX_LINE];
 
STARTUPINFO si={0,};
PROCESS_INFORMATION pi;
 
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           szClassName,       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 00))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i=0;
 
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            sec.nLength=sizeof(SECURITY_ATTRIBUTES);
            sec.bInheritHandle=TRUE;
            sec.lpSecurityDescriptor=NULL;
 
            CreatePipe(&write_out,&write_in,&sec,0);
            CreatePipe(&read_in,&read_out,&sec,0);
 
            sprintf(command,"./adb.exe shell",NULL);
 
            si.cb=sizeof(STARTUPINFO);
            si.hStdInput=write_out;
            si.hStdOutput=read_out;
            si.dwFlags=STARTF_USESTDHANDLES;
 
            rtv=CreateProcess(NULL,
                            command,
                            NULL,
                            NULL,
                            TRUE,
                            NULL,
                            NULL,
                            NULL,
                            &si,
                            &pi);
 
            if(!rtv){
                printf("Error");
                PostQuitMessage (0);
            }
 
            break;
        case WM_KEYDOWN:
            strcpy(buffer,"input keyevent 26\n");
            WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
            printf("%s",buffer);
 
            for(i=0;i<MAX_LINE;i++){
                buffer[i]=0x00;
            }
 
            ReadFile(read_in,buffer,sizeof(buffer),&readn,NULL);
            printf("%s",buffer);
            break;
        case WM_DESTROY:
            strcpy(buffer,"exit\n");
            WriteFile(write_in,buffer,strlen(buffer),&writen,NULL);
            printf("%s",buffer);
 
            CloseHandle(write_in);
            CloseHandle(write_out);
            CloseHandle(read_in);
            CloseHandle(read_out);
            CloseHandle(pi.hProcess);
 
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
 
 
cs


윗 방법을 이용해서 Win32로 GUI을 적용할 수 있게 된다.

여기서, 키보드를 누르면 전원키를 누르는 효과를 가지게 된다.


Timer을 이용해서 ADB의 ScreenCap의 내용을 가지고 오게 할 수도 있다.

Posted by JunkMam
,