2017-06-17 작업일지
본문
WinAPI Version
#include <windows.h>
#include <iostream>
HGLOBAL ReadImageFile(LPCSTR filePath, int maxReads) {
HANDLE hFile = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
return NULL;
}
SIZE_T bufferSize;
DWORD bytesRead;
int readCount = 0;
// 파일에서 일정 횟수까지 4바이트 단위로 읽음
while (readCount < maxReads) {
if (!ReadFile(hFile, &bufferSize, sizeof(DWORD), &bytesRead, NULL) || bytesRead != sizeof(DWORD)) {
CloseHandle(hFile);
return NULL;
}
if (SetFilePointer(hFile, bufferSize, NULL, FILE_CURRENT) == INVALID_SET_FILE_POINTER) {
CloseHandle(hFile);
return NULL;
}
readCount++;
}
// 이미지 데이터 크기를 읽음
if (!ReadFile(hFile, &bufferSize, sizeof(DWORD), &bytesRead, NULL) || bytesRead != sizeof(DWORD)) {
CloseHandle(hFile);
return NULL;
}
// 메모리 할당
HGLOBAL hMemory = GlobalAlloc(GMEM_MOVEABLE, bufferSize);
if (hMemory == NULL) {
CloseHandle(hFile);
return NULL;
}
// 파일에서 메모리로 데이터 읽기
LPVOID pMemory = GlobalLock(hMemory);
if (!ReadFile(hFile, pMemory, bufferSize, &bytesRead, NULL) || bytesRead != bufferSize) {
GlobalUnlock(hMemory);
GlobalFree(hMemory);
CloseHandle(hFile);
return NULL;
}
GlobalUnlock(hMemory);
CloseHandle(hFile);
return hMemory;
}
// 클라이언트 .IMG Draw 부분
//----- (0042F1D0) --------------------------------------------------------
HGLOBAL __thiscall sub_42F1D0(void *this, LPCSTR NumberOfBytesRead, int a3)
{
HANDLE v3; // esi@1
int v4; // ebp@2
HGLOBAL v5; // eax@9
HGLOBAL v6; // ebx@9
HGLOBAL result; // eax@14
int v8; // ecx@18
int v9; // eax@19
int v10; // edi@19
__int16 v11; // dx@20
int v12; // esi@21
unsigned __int16 v13; // dx@22
int v14; // edx@22
unsigned int v15; // ebp@23
SIZE_T Buffer; // [sp+10h] [bp-8h]@3
void *v17; // [sp+14h] [bp-4h]@1
v17 = this;
v3 = CreateFileA(NumberOfBytesRead, 0x80000000u, 1u, 0, 3u, 0x80u, 0);
if ( v3 == (HANDLE)-1 )
return 0;
v4 = 0;
if ( a3 > 0 )
{
while ( ReadFile(v3, &Buffer, 4u, (LPDWORD)&NumberOfBytesRead, 0)
&& NumberOfBytesRead == (LPCSTR)4
&& SetFilePointer(v3, Buffer, 0, 1u) != -1 )
{
++v4;
if ( v4 >= a3 )
goto LABEL_7;
}
goto LABEL_13;
}
LABEL_7:
if ( !ReadFile(v3, &Buffer, 4u, (LPDWORD)&NumberOfBytesRead, 0)
|| NumberOfBytesRead != (LPCSTR)4
|| (v5 = GlobalAlloc(0, Buffer), (v6 = v5) == 0) )
{
LABEL_13:
CloseHandle(v3);
return 0;
}
if ( !ReadFile(v3, v5, Buffer, (LPDWORD)&NumberOfBytesRead, 0) || NumberOfBytesRead != (LPCSTR)Buffer )
{
GlobalFree(v6);
goto LABEL_13;
}
if ( CloseHandle(v3) )
{
if ( !*((_DWORD *)v17 + 401) )
{
v8 = (int)((char *)v6 + 4);
if ( *((_WORD *)v6 + 1) )
{
v9 = (unsigned __int16)(*((_WORD *)v6 + 1) - 1) + 1;
v10 = (unsigned __int16)(*((_WORD *)v6 + 1) - 1) + 1;
do
{
LOWORD(v9) = *(_WORD *)v8;
v8 += 2;
v11 = v9;
v9 += 65535;
if ( v11 )
{
v9 = (unsigned __int16)v9 + 1;
v12 = v9;
do
{
v13 = *(_WORD *)(v8 + 2);
v8 += 4;
v14 = v13;
if ( v14 > 0 )
{
do
{
LOWORD(v9) = *(_WORD *)v8;
v8 += 2;
v15 = v9;
v9 &= 0x1Fu;
--v14;
*(_WORD *)(v8 - 2) = v9 | (v15 >> 1) & 0x7FE0;
}
while ( v14 );
}
--v12;
}
while ( v12 );
}
--v10;
}
while ( v10 );
}
}
result = v6;
}
else
{
GlobalFree(v6);
result = 0;
}
return result;
}
댓글목록 0
등록된 댓글이 없습니다.
