2017-06-17 작업일지

작성자 최고관리자
작성일 17-06-17 18:58 | 736 | 0

본문

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

등록된 댓글이 없습니다.