-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmp6tool.cpp
More file actions
97 lines (85 loc) · 2.68 KB
/
mp6tool.cpp
File metadata and controls
97 lines (85 loc) · 2.68 KB
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
// mp6tool.cpp: îïðåäåëÿåò òî÷êó âõîäà äëÿ êîíñîëüíîãî ïðèëîæåíèÿ.
//
#include "stdafx.h"
void AppendSO(TCHAR* mp6file, TCHAR* addend, TCHAR* alias) {
HANDLE f1 = CreateFile(mp6file, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
HANDLE f2 = CreateFile(addend, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
char buf[512];
DWORD bRead=1;
BYTE len = (BYTE)_tcslen(alias);
WORD chunksize = 26 + len;
DWORD written; //dummy?
//ñíà÷àëà ïèøåì çàãîëîâîê SO
SetFilePointer(f1, 0, NULL, FILE_END);
WriteFile(f1, &chunksize, 2, &written, NULL);
WriteFile(f1, &len, 1, &written, NULL);
WriteFile(f1, alias, len, &written, NULL);
WriteFile(f1, "application/octet-stream;", 25, &written, NULL);
//WriteFile(f1, &bRead, 4, NULL, NULL);
while (bRead > 0) {
ReadFile(f2, buf, 512, &bRead, NULL);
WriteFile(f1, buf, bRead, &bRead, NULL);
}
CloseHandle(f1); CloseHandle(f2);
}
void CreateMP6(TCHAR* mp6file) {
HANDLE f = CreateFile(mp6file, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
WriteFile(f, "MP6", 3, NULL, NULL);
CloseHandle(f);
}
void ExtractSO(TCHAR* mp6file, TCHAR* target, TCHAR* alias) {
HANDLE f1 = CreateFile(mp6file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
HANDLE f2;
//ïàðñèì
char buf[512];
WORD chunk_len;
WORD so_len;
int i;
ReadFile(f1, buf, 3, NULL, NULL);
//ïðîâåðèì ñèãíàòóðó
if (strcmp(buf, "MP6"))return;
ReadFile(f1, buf, 1, NULL, NULL);
while (GetLastError() == ERROR_SUCCESS) {
ReadFile(f1, &chunk_len, 2, NULL, NULL);
ReadFile(f1, buf, chunk_len, NULL, NULL);
if (buf[0] && 0xc0 == 0) {
//÷àíê=SO
so_len = buf[0];
//ïðîâåðÿåì èìÿ
//÷àíê ñîñòîèò èç äëèíû èìåíè, èìåíè (ä.á. ñîâïàäàòü ñ alias), òèïà, ðàçäåëèòåëÿ ";" è ñîäåðæèìîãî
//WideCharToMultiByte(0, 0, alias, lstrlen(alias), buf, 512, "\0", NULL);
if (!memcmp(buf, alias,so_len)) {
//èìÿ ñîâïàëî, âûãðóæàåì
for (i = so_len + 1; buf[i] != ';'; i++);
f2 = CreateFile(target, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
WriteFile(f2, buf + i+1, chunk_len - i-1, NULL, NULL);
CloseHandle(f2);
return;
}
}
else if (buf[0] && 0xC0 == 0x40) {
//÷àíê=ESDU
}
else if (buf[0] && 0xC0 == 0x80) {
//÷àíê=SNCP. ïðîñòî ïðîïóñêàåì +2 áàéòà.
ReadFile(f1, buf, 2, NULL, NULL);
}
//â íà÷àëî öèêëà, ïîêà íå êîí÷èòñÿ ôàéë.
}
}
int wmain(int argc,TCHAR**argv)
{
if (argc < 2) {
printf("Usage:...\n");
return 0;
}
if (lstrcmp(argv[1], TEXT("a"))==0) {
AppendSO(argv[2], argv[3], argv[4]);
return 0;
}
if (lstrcmp(argv[1], TEXT("x"))==0) {
ExtractSO(argv[2], argv[3], argv[4]);
return 0;
}
return 0;
}