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.
12345 Constant Generic meaningGENERIC_ALL All possible access rightsGENERIC_EXECUTE Execute accessGENERIC_READ Read accessGENERIC_WRITE Write access
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.
1234567891011 00x00000000FILE_SHARE_DELETE0x00000004FILE_SHARE_READ0x00000001FILE_SHARE_WRITE0x00000002
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.
12345678910 1 - CREATE_NEW - Yeni dosya yaratır, zaten varsa hata kodu döndürür.80 - ERROR_FILE_EXISTS2 - CREATE_ALWAYS - Yeni dosya yaratır. Zaten yaratılmışsa da üzerine yazar.183 - ERROR_ALREADY_EXISTS kodunu döndürür.3 - OPEN_EXISTING - Dosya veya bir aygıtı açar.Eğer dosya veya aygıt bulunamazsa hata kodunu döndürür.2 - ERROR_FILE_NOT_FOUND4 - OPEN_ALWAYS - Bir dosyayı 183 - ERROR_ALREADY_EXISTS hata koduyla açar.Dosyayı bulamazsa hata kodu 0 döndürür.5 - TRUNCATE_EXISTING - Varolan bir dosyayı açar ve 0 olarak kırpar. Yani içindekileri siler.
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.
1234567891011121314151617181920212223242526272829 FILE_ATTRIBUTE_ARCHIVE32 (0x20) ;uygulamalar bu özelliği dosyaları yedek;ya da kaldırma işlemleri için işaretlerken kullanırlar.FILE_ATTRIBUTE_ENCRYPTED16384 (0x4000) ;dosya veya dizin şifrelenmişFILE_ATTRIBUTE_HIDDEN2 (0x2) ;dosyanın gizli bir dosya olduğunu belirtirFILE_ATTRIBUTE_NORMAL128 (0x80) ;normal dosya, genelde bu kullanılırFILE_ATTRIBUTE_OFFLINE4096 (0x1000)FILE_ATTRIBUTE_READONLY1 (0x1) ;salt-okunur dosyaFILE_ATTRIBUTE_SYSTEM4 (0x4) ;sistem dosyası olduğunu beliritirFILE_ATTRIBUTE_TEMPORARY256 (0x100) ;dosyanın geçici depolama için kullanılacağını belirtir.FILE_FLAG_OVERLAPPED0x40000000 ;ÖNEMLİ;dosya veya aygıtın asenkron olarak açıldığını belirtir.
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.
1 INVALID_HANDLE_VALUE - FFFFFFFF
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.
123456789101112131415161718192021222324252627 ERROR_FILE_NOT_FOUND2 (0x2)The system cannot find the file specified.ERROR_PATH_NOT_FOUND3 (0x3)The system cannot find the path specified.ERROR_TOO_MANY_OPEN_FILES4 (0x4)The system cannot open the file.ERROR_ACCESS_DENIED5 (0x5)Access is denied.ERROR_INVALID_HANDLE6 (0x6)The handle is invalid.ERROR_ARENA_TRASHED7 (0x7)The storage control blocks were destroyed.ERROR_NOT_ENOUGH_MEMORY8 (0x8)Not enough storage is available to process this command.
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