19,468
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shellapi.h>
#include <shlwapi.h>
// 0xFFD8: SOI
// 0xFFE0: APP0
// 0xFFE1: APP1
// 0xFFE2: APP2
// 0xFFE3: APP3
// 0xFFE4: APP4
// 0xFFE5: APP5
// 0xFFE6: APP6
// 0xFFE7: APP7
// 0xFFE8: APP8
// 0xFFE9: APP9
// 0xFFDB: DQT
// 0xFFC0: SOF0
// 0xFFC4: DHT
// 0xFFDA: SOS
// 0xFFD9: EOI
int main(int argc, char *argv[])
{
HANDLE hFile = CreateFile(TEXT("image.jpg"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
LARGE_INTEGER lli = { 0 };
if (GetFileSizeEx(hFile, &lli)) {
HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hMapping != NULL) {
BYTE *lpFileBuffer = (BYTE *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
if (lpFileBuffer != NULL) {
BYTE *lpStartBuffer = lpFileBuffer;
BYTE *lpEndBuffer = lpFileBuffer + (size_t)lli.QuadPart;
while (lpStartBuffer < lpEndBuffer) {
BYTE b1 = lpStartBuffer[0];
BYTE b2 = lpStartBuffer[1];
BYTE b3 = lpStartBuffer[2];
BYTE b4 = lpStartBuffer[3];
WORD wMark = MAKEWORD(b2, b1);
WORD wSize = MAKEWORD(b4, b3);
size_t uOffset = lpStartBuffer - lpFileBuffer;
lpStartBuffer += sizeof(wSize);
if ((wMark != 0xFFD8) && (wMark != 0xFFD9)) {
lpStartBuffer += wSize;
}
switch (wMark) {
case 0xFFD8:
printf("SOI => from %u\n", uOffset);
break;
case 0xFFE0:
printf("APP0 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE1:
printf("APP1 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE2:
printf("APP2 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE3:
printf("APP3 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE4:
printf("APP4 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE5:
printf("APP5 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE6:
printf("APP6 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE7:
printf("APP7 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE8:
printf("APP8 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE9:
printf("APP9 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFDB:
printf("DQT => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFC0:
printf("SOF0 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFC4:
printf("DHT => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFDA:
printf("SOS => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFD9:
printf("EOI => from %u\n", uOffset);
break;
default:
break;
}
}
}
UnmapViewOfFile(lpFileBuffer);
}
CloseHandle(hMapping);
}
CloseHandle(hFile);
}
return 0;
}