lại WAIT_IO_COMPLETION. Nếu function hoàn thành , và quá trình đọc file hoàn thành, nhưng lệnh gọi thread không có trong alertable wait state, hệ thống queue lệnh call completion thông thường, típ tục lệnh call cho đến khi lệnh gọi thread “gia nhập” alertable wait state. Để biết thông tin về alertable wait và overlapped input / output, các bác hãy đọc Synchronization and Overlapped Input and Output. Nếu hàm ReadFileEx cố gắng đọc qua đoạn cuối của file, giá trị trả về là FALSE, và GetLastError trở về ERROR_HANDLE_EOF. SetFilePointer Hàm SetFilePointer có nhiệm vụ di chuyển pointer của open file Code: DWORD SetFilePointer( HANDLE hFile, // handle of file LONG lDistanceToMove, // number of bytes to move file pointer PLONG lpDistanceToMoveHigh, // address of high-order word of dist. to move DWORD dwMoveMethod // how to move ); Returns Nếu function hoàn thành , giá trị trả về là low-order doubleword của new file pointer, và nếu IpDistanceToMoveHigh không phải là NULL, function đặt high- order doubleword của new file pointer vào trong LONG pointer bằng các thông số đó WriteFile Hàm WriteFile có nhiệm vụ viết dữ liệu vào file và được design cho cả 2 quá trình đồng bộ và không đồng bộ. Hàm này bắt đầu viết dữ liệu vào file tại vị trí được cho biết bởi file pointer. Sau khi viết xong, file pointer sửa lại cho đúng bằng số byte đã được viết, trừ khi file được mở với FILE_FLAG_OVERLAPPED. ). Nếu file handle được tạo để overlapped input (cho vào) và output (lấy ra) (I / O) , sau khi viết xong application phải chỉnh lại cho đúng vị trí của file pointer. Code: BOOL WriteFile( HANDLE hFile, // handle of file to write to LPCVOID lpBuffer, // address of data to write to file DWORD nNumberOfBytesToWrite, // number of bytes to write LPDWORD lpNumberOfBytesWritten, // address of number of bytes written LPOVERLAPPED lpOverlapped // addr. of structure needed for overlapped I/O ); Returns Nếu function hoàn thành , giá trị trả về là TRUE. Nếu function không hoàn thành , giá trị trả về là FALSE. Để có thêm thông tin về lỗi, chúng ta dùng hàm GetLastError. WriteFileEx Hàm WriteFileEx có nhiệm vụ viết dữ liệu vào file. Nó chỉ được design cho quá trình không đồng bộ, khác với hàm WriteFile được design cho cả 2 quá trình đồng bộ và không đồng bộ. Hàm WriteFileEx “báo cáo” tình trạng không đồng bộ của nó, gọi completion routine chỉ định khi quá trình viết hoàn thành và lệnh gọi thread là alertable wait state Code: BOOL WriteFileEx( HANDLE hFile; // handle to output file LPCVOID lpBuffer; // pointer to input buffer DWORD nNumberOfBytesToWrite; // number of bytes to write LPOVERLAPPED lpOverlapped; // pointer to async. i/o data LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine; // ptr. to completion routine ); Returns Nếu function hoàn thành , giá trị trả về là TRUE. Nếu function không hoàn thành , giá trị trả về là FALSE. Để có thêm thông tin về lỗi, chúng ta dùng hàm GetLastError. Nếu hàm WriteFileEx hoàn thành , calling thread có quá trình I/O không đồng bộ trong khoảng thời gian : overlapped viết thao tác vào file. Khi quá trình I/O này kết thúc, và lệnh gọi thread bị khóa trong alertable wait state, hệ thống gọi hàm IpCompletionRoutine, và sự chờ đợi hoàn thành với đoạn code trở lại WAIT_IO_COMPLETION. Nếu function hoàn thành và quá trình viết dữ liệu vào file hoàn thành, nhưng lệnh call thread không nằm trong alertable wait state, hệ thống queue lệnh call *IpCompletion, típ tục lệnh call cho đến khi lệnh gọi thread “gia nhập” alertable wait state. Đọc Synchronization để biết thêm thông tin về alertable wait state và quá trình overlapped input / output WritePrivateProfileStringA / WritePrivateProfileStringW Code: BOOL WritePrivateProfileString( LPCTSTR lpszSection, // address of section name LPCTSTR lpszKey, // address of key name LPCTSTR lpszString, // address of string to add LPCTSTR lpszFile // address of initialization filename ); Returns Nếu function copy string vào file khởi tạo thành công, giá trị trả về là TRUE. Nếu function không hoàn thành , hoặc nếu nó flush cached version của hầu hết file khởi tạo truy cập gần đây, giá trị trả về là FALSE. Để có thông tin về lỗi, chúng ta dùng hàm GetLastError. 03.5 Registry Accesses ============== RegCreateKeyA / RegCreateKeyW Hàm RegCreateKey có nhiệm vụ tạo specified key. Nếu key đã có trong registry, hàm này sẽ mở nó. Hàm này tương thích với Windows 3.1. Đối với Win32 chúng ta nên sử dụng hàm RegCreateKeyEx. Code: LONG RegCreateKey( HKEY hKey, // handle of an open key LPCTSTR lpszSubKey, // address of name of subkey to open PHKEY phkResult // address of buffer for opened handle ); Returns Nếu function hoàn thành , giá trị trả về là ERROR_SUCCESS Nếu function không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegCreateKeyExA / RegCreateKeyExW Hàm RegCreateKeyEx có nhiệm vụ tạo specified key. . Nếu key đã có trong registry, hàm này sẽ mở nó. Code: LONG RegCreateKeyEx( HKEY hKey, // handle of an open key LPCTSTR lpszSubKey, // address of subkey name DWORD dwReserved, // reserved LPTSTR lpszClass, // address of class string DWORD fdwOptions, // special options flag REGSAM samDesired, // desired security access LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of key security structure PHKEY phkResult, // address of buffer for opened handle LPDWORD lpdwDisposition // address of disposition value buffer ); Returns Nếu function hoàn thành , giá trị trả về là ERROR_SUCCESS Nếu function không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegDeleteKeyA / RegDeleteKeyW Hàm RegDeleteKey có nhiệm vụ xóa key và tất cả các key khác nằm trong nó Code: LONG RegDeleteKey( HKEY hKey, // handle of open key LPCTSTR lpszSubKey // address of name of subkey to delete ); Returns Nếu function hoàn thành , giá trị trả về là ERROR_SUCCESS Nếu function không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegDeleteValueA / RegDeleteValueW Hàm RegDeleteValue có nhiệm vụ di chuyển named value từ specified registry key Code: LONG RegDeleteValue( HKEY hKey, // handle of key LPTSTR lpszValue // address of value name ); Returns Nếu function hoàn thành , giá trị trả về là ERROR_SUCCESS Nếu function không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegOpenKeyA / RegOpenKeyW Hàm RegOpenKey có nhiệm vụ mở specified key. Hàm này tương thích với Windows 3.1. Đối với Win32 chúng ta nên dùng hàm RegOpenKeyEx Code: LONG RegOpenKey( HKEY hKey, // handle of open key LPCTSTR lpszSubKey, // address of name of subkey to open PHKEY phkResult // address of handle of open key ); Returns Nếu function hoàn thành , giá trị trả về là ERROR_SUCCESS Nếu function không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegOpenKeyExA / RegOpenKeyExW Hàm RegOpenKeyEx có nhiệm vụ mở specified key Code: LONG RegOpenKeyEx( HKEY hKey, // handle of open key LPCTSTR lpszSubKey, // address of name of subkey to open DWORD dwReserved, // reserved REGSAM samDesired, // security access mask PHKEY phkResult // address of handle of open key ); Returns Nếu function hoàn thành , giá trị trả về là ERROR_SUCCESS Nếu function không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegQueryValueA / RegQueryValueW Hàm RegQueryValue có nhiệm vụ tìm giá trị kết hợp với giá trị không tên cho specified key trong registry. Những giá trị trong registry có tên, type (loại) và thành phần dữ liệu. Hàm này tìm dữ liệu cho giá trị đầu tiên của key có NULL name. Hàm này tương thích với Windows 3.1. Còn đối với Win32 thì chúng ta nên dùng hàm RegQueryValueEx. Code: LONG RegQueryValue( HKEY hKey, // handle of key to query LPCTSTR lpszSubKey, // address of name of subkey to query LPTSTR lpszValue, // address of buffer for ret string PLONG pcbValue // address of buffer for size of ret string ); Returns Nếu function hoàn thành , giá trị trả về là ERROR_SUCCESS Nếu function không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegQueryValueExA / RegQueryValueExW Hàm RegQueryValueEx có nhiệm vụ tìm loại và dữ liệu cho giá trị có tên đã được xác định kết hợp với việc mở registry key. . không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegOpenKeyA / RegOpenKeyW Hàm RegOpenKey có nhiệm vụ mở specified key. Hàm này tương thích với Windows 3 .1. Đối với Win32 chúng ta nên dùng. specified key. Nếu key đã có trong registry, hàm này sẽ mở nó. Hàm này tương thích với Windows 3 .1. Đối với Win32 chúng ta nên sử dụng hàm RegCreateKeyEx. Code: LONG RegCreateKey( HKEY hKey,. hoàn thành , giá trị trả về là ERROR_SUCCESS Nếu function không hoàn thành , giá trị trả về là 1 giá trị lỗi. RegCreateKeyExA / RegCreateKeyExW Hàm RegCreateKeyEx có nhiệm vụ tạo specified