Decoupe fichiers par api win32

Contenu du snippet

Une demo pour se servir des fichiers pas API.
Pas de zip car tout code du seul module dessous.
But du prog:
decouper un fichier chm en 2 morceax, un autre en 3.
Les chm seront mis dans dossier de exe.
Dans code on voit taille originale de chacun.
Prevu pour chaque morceau taille envoyable par mail.

Source / Exemple :


#include <windows.h>

// Petzold = 4619268 => 2309634 * 2
// Richter = 6028717 => 2009573 + 2009572 + 2009572
void    *pmem;
char    szdst[12];
HANDLE  hheap;
char    *szNOMEMORY = "Problème memoire";
char    *szappname = "DocWinApi";

void AppPathInitialize()
{
  char *szThis , *c;
  szThis = (char*) pmem;
  c = szThis + GetModuleFileName(NULL, szThis, 300);
  while(*c != '\\') c--; *c = 0;
  SetCurrentDirectory(szThis);
}

DWORD Richter()
{
  DWORD val, retv;
  HANDLE hsrc, hdst;
  hsrc = CreateFile("Richter4.chm", GENERIC_READ, 0, 0,
                    OPEN_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0);
  if(hsrc == INVALID_HANDLE_VALUE) return 0;

  • ((DWORD*)szdst) = 0x68636952; // "Rich"
  • ((DWORD*)(szdst+4)) = 0x2E726574; // "ter."
  • ((DWORD*)(szdst+8)) = 49; // "1"
val = retv = 0; hdst = CreateFile(szdst, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0); if(hdst == INVALID_HANDLE_VALUE) goto closeSrc; ReadFile(hsrc, pmem, 2009573, &val, 0); if(val != 2009573) goto closeDst; val = 0; WriteFile(hdst, pmem, 2009573, &val, 0); if(val != 2009573) goto closeDst; CloseHandle(hdst); // 1 octet de moins sur 2 passes suivantes
  • ((DWORD*)(szdst+8)) = 50;
hdst = CreateFile(szdst, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0); if(hdst == INVALID_HANDLE_VALUE) goto closeSrc; val = 0; ReadFile(hsrc, pmem, 2009572, &val, 0); if(val != 2009572) goto closeDst; val = 0; WriteFile(hdst, pmem, 2009572, &val, 0); if(val != 2009572) goto closeDst;
  • ((DWORD*)(szdst+8)) = 51;
hdst = CreateFile(szdst, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0); if(hdst == INVALID_HANDLE_VALUE) goto closeSrc; val = 0; ReadFile(hsrc, pmem, 2009572, &val, 0); if(val != 2009572) goto closeDst; val = 0; WriteFile(hdst, pmem, 2009572, &val, 0); if(val != 2009572) goto closeDst; retv = 1; closeDst: CloseHandle(hdst); closeSrc: CloseHandle(hsrc); return retv; } DWORD Petzold() { DWORD val, retv; HANDLE hsrc, hdst; hsrc = CreateFile("Petzold5.chm", GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0); if(hsrc == INVALID_HANDLE_VALUE) return 0;
  • ((DWORD*)szdst) = 0x7A746550; // "Petz"
  • ((DWORD*)(szdst+4)) = 0x2E646C6F; // "old."
  • ((DWORD*)(szdst+8)) = 49; // "1"
val = retv = 0; hdst = CreateFile(szdst, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0); if(hdst == INVALID_HANDLE_VALUE) goto closeSrc; ReadFile(hsrc, pmem, 2309634, &val, 0); if(val != 2309634) goto closeDst; val = 0; WriteFile(hdst, pmem, 2309634, &val, 0); if(val != 2309634) goto closeDst; CloseHandle(hdst);
  • ((DWORD*)(szdst+8)) = 50;
hdst = CreateFile(szdst, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0); if(hdst == INVALID_HANDLE_VALUE) goto closeSrc; val = 0; ReadFile(hsrc, pmem, 2309634, &val, 0); if(val != 2309634) goto closeDst; val = 0; WriteFile(hdst, pmem, 2309634, &val, 0); if(val != 2309634) goto closeDst; retv = 1; closeDst: CloseHandle(hdst); closeSrc: CloseHandle(hsrc); return retv; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int) { hheap = GetProcessHeap(); if((pmem = HeapAlloc(hheap, 0, 2310000)) == 0) { MessageBox(0, szNOMEMORY, szappname, MB_ICONEXCLAMATION); return 0; } AppPathInitialize(); if(!Petzold()) goto msgBad; if(Richter()) goto relMem; msgBad: MessageBox(0, "ERREUR", szappname, MB_ICONEXCLAMATION); relMem: HeapFree(hheap, 0, pmem); return 0; }

Conclusion :


Morceaux dispos avec module de recomposition en asm.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.