disk_image.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <stdlib.h>
  2. #include "disk_image.h"
  3. #include "general.h"
  4. DISK_IMG *ImgOpen(const char *pszPath)
  5. {
  6. HANDLE FileHandle = CreateFileA(pszPath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  7. if(FileHandle == INVALID_HANDLE_VALUE)
  8. return NULL;
  9. DISK_IMG *pImg = MxfsAlloc(sizeof(DISK_IMG));
  10. if(!pImg)
  11. return NULL;
  12. pImg->FileHandle = FileHandle;
  13. InitializeCriticalSection(&pImg->Lock);
  14. return pImg;
  15. }
  16. void ImgClose(DISK_IMG *pImg)
  17. {
  18. if(!pImg) return;
  19. CloseHandle(pImg->FileHandle);
  20. MxfsFree(pImg);
  21. }
  22. int ImgRead(DISK_IMG *pImg, unsigned uOffset, unsigned cBytes, PVOID pBuf)
  23. {
  24. DWORD dwBytesRead;
  25. BOOL bSuccess;
  26. EnterCriticalSection(&pImg->Lock);
  27. SetFilePointer(pImg->FileHandle, uOffset, NULL, FILE_BEGIN);
  28. bSuccess = ReadFile(pImg->FileHandle, pBuf, cBytes, &dwBytesRead, NULL);
  29. LeaveCriticalSection(&pImg->Lock);
  30. if(!bSuccess || dwBytesRead != cBytes)
  31. return -ERROR_READ_FAULT;
  32. return 0;
  33. }
  34. int ImgWrite(DISK_IMG *pImg, unsigned uOffset, unsigned cBytes, PVOID pBuf)
  35. {
  36. DWORD dwBytesWritten = 0;
  37. BOOL bSuccess = FALSE;
  38. EnterCriticalSection(&pImg->Lock);
  39. if(uOffset + cBytes <= GetFileSize(pImg->FileHandle, NULL))
  40. {
  41. SetFilePointer(pImg->FileHandle, uOffset, NULL, FILE_BEGIN);
  42. bSuccess = WriteFile(pImg->FileHandle, pBuf, cBytes, &dwBytesWritten, NULL);
  43. }
  44. LeaveCriticalSection(&pImg->Lock);
  45. if(!bSuccess || dwBytesWritten != cBytes)
  46. return -ERROR_WRITE_FAULT;
  47. return 0;
  48. }
  49. unsigned ImgGetSize(DISK_IMG *pImg)
  50. {
  51. EnterCriticalSection(&pImg->Lock);
  52. unsigned uSize = GetFileSize(pImg->FileHandle, NULL);
  53. LeaveCriticalSection(&pImg->Lock);
  54. return uSize;
  55. }