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à NU
Trang 1lạ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
Trang 2LPOVERLAPPED 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
Trang 3WritePrivateProfileStringA / 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
Trang 4DWORD 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
Trang 5Code:
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
);
Trang 6Returns
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