CreateFile, WriteFile ve ReadFile API kullanımı

Kategori Assembly
08.05.2017
3288 Okunma

Esen!
Win32Assembly’de bir dosyaya yazmak ya da bir dosyadan okumak işlemlerini yapmak istiyorsak ilk önce o dosyayı OKUMAK ya da YAZMAK veya her ikisi içinde AÇMAK veya YARATMAK zorundayız. Böylece elimizde yeni yaratılmış veya varolan bir dosya/aygıtın HANDLE değeri olur. Sonrasında yazmak – WriteFile ya da Okumak – ReadFile gibi işlemlerimizi yapabiliriz

CreateFile

HANDLE WINAPI CreateFile(
  _In_     LPCTSTR               lpFileName,
  _In_     DWORD                 dwDesiredAccess,      ;
  _In_     DWORD                 dwShareMode,
  _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_     DWORD                 dwCreationDisposition,
  _In_     DWORD                 dwFlagsAndAttributes,
  _In_opt_ HANDLE                hTemplateFile
);

CreateFile bize açılacak dosya veya aygıtın “HANDLE” değerini döndürür.
lpFileName açılacak dosya/aygıt vb adının göstergecidir (pointer)
dwDesiredAccess ile dosyanın okumak, mı yazmak mı yoksa hepsi için mi yaratılacağını belirtir. Bunun için Erişim Haklarına bakmamız gerekiyor.

dwShareMode ile açılan/yaratılan dosyanın başka prosesler tarafından da erişilip erişilemeyeceği, erişilirse ne yapabileceği belirtilir. Ayrıca bu modlar “or” operatörü ile birleştirilerek kullanılabilir.

lpSecurityAttributes; bu parametre NULL olabilir.SECURITY_ATTRIBUTES yapısına bir göstergeçtir.
dwCreationDisposition; bir dosyanın varolmasına ya da belirtilen yerde bulunmamasına göre ne yapılacağını söyler.

dwFlagsAndAttributes; öznitelikler ve bayraklar olarak çevrilebilir. Açılan dosyanın normal mi arşiv dosyası mı olduğu ya da – readonly-salt okunur – olarak mı açıldığını bildiren bayrakları ve öznitelikleri taşır. Dosya Özellikleri Sabitleri betinden ayrıntılı listeyi inceleyebilrsiniz.

hTemplateFile NULL olabilir. Dosya okunmak için açıldığında taslak bir dosya varsa onun handle değerini içerir. Genelde NULL değeri ile geçilir. Eğer varolan bir dosya açılıyorsa CreateFile bu parametreyi es geçer.

Dönüş değeri: Dosya/Aygıt ‘ın HANDLE değeri. Tabi başarılı bir şekilde açılmışsa. Eğer başarılı bir şekilde açılmamışsa INVALID_HANDLE_VALUE döndürülür.

Dosyanın bulunamaması ya da varolan bir dosyanın açılması gibi durumlar söz konusu olabilir. İşte o zaman farklı ve anlamlı bazı değerler ortaya çıkar. Bu değerleri GetLastError APIsi ile döndürebilir ona göre de dallanmalar yapabiliriz. Bu API “Sistem hata kodları” adı altındaki bir listedeki hata kodlarını durumun uygunluğuna göre döndürebilir. Özellikle ilk 0 – 499 Sistem Hata Kodunu incelemekte ve ayırdında olmakta yarar var.

CreateFile APIsi çok önemli bir yordamdır. MSDN’deki belgelendirmeyi iyice okumak gerekiyor.

WriteFile

Handle değeri belirtilen dosya/aygıta belirtilen veriyi yazar. Hem senkron hem asenkron işlem yapabilir.

BOOL WINAPI WriteFile(
  _In_        HANDLE       hFile,
  _In_        LPCVOID      lpBuffer,
  _In_        DWORD        nNumberOfBytesToWrite,
  _Out_opt_   LPDWORD      lpNumberOfBytesWritten,
  _Inout_opt_ LPOVERLAPPED lpOverlapped
);

hFile içine yazılacak dosya veya aygıtın HANDLE değeri. Bu handle mutlaka “yazma erişimi” ile oluşturulmuş olmalıdır.
lpBuffer yazdıracağımız her ne ise onu gösteren göstergeç-pointer budur. Yazma işlemi bitene kadar bu tampon kullanılmamalıdır.
nNumberOfBytesToWrite yazdıracağımız verinin büyüklüğünü içerir. Sayısal bir değerdir. lstrlen yordamı ile yazdıracağımız verinin uzunluğunu/büyüklüğünü döndürüp hepsini yarısını vb ayarlayıp yazdırabiliriz.
lpNumberOfBytesWritten bir pointer/göstergeçtir. Yazma işleminden sonra bu değişkene yazdırılan verinin büyüklüğü döner. Bu senkron bir işlemse tanımlanır. Eğer işlemlerimizi asenkron ise bu değer NULL olabilir.
lpOverlapped bu pointer OVERLAPPED yapısına işaret eder. Asenkron işlemlerde tanımlanır. Diğer durumlarda NULL olabilir.

ReadFile

Okuma erişimi ile döndürülen HANDLE değerine ait dosya ve ya aygıttan okuma yapar. Okumaya başlayacağı yeri eğer aygıt destekliyorsa aygıtın göstereceği “file pointer”dan başlar. Hem senkron hem de asenkron okuma yapabilir.

BOOL WINAPI ReadFile(
  _In_        HANDLE       hFile,
  _Out_       LPVOID       lpBuffer,
  _In_        DWORD        nNumberOfBytesToRead,
  _Out_opt_   LPDWORD      lpNumberOfBytesRead,
  _Inout_opt_ LPOVERLAPPED lpOverlapped
);

hFile okuma yapılacak dosya/aygıt’ın HANDLE değeri.
lpBuffer dosya veya aygıttan yapılan okumanın yazılacağı yeri gösteren göstergeç/pointer
nNumberOfBytesToRead dosya ve ya aygıttan ne kadarlık okuma yapılacağını gösteren sayısal değer.
lpNumberOfBytesRead değişkenine(göstergeç) ReadFile yordamı çalıştıktan sonra okunan verinin büyüklüğü aktarılır. hFile değeri senkron bir şekilde açılmışsa bu değişkenin tanımlanmış olması gerekir. Asenkron bir HANDLE varsa bunun değeri NULL olabilir.
LPOVERLAPPED bu pointer OVERLAPPED yapısına işaret eder. Asenkron işlemlerde tanımlanır. Diğer durumlarda NULL olabilir.

Bu APIleri anlatan iki örnek kaynak kod hazırladım. Ayrıca içlerinde de açıklama satırlarını okuyabilirsiniz.
[dm]147[/dm]
[dm]148[/dm]

İyi çalışmalar, Kolay gelsin.

Comments of this post

Henüz yorum bulunmuyor!