Ask Learn
Preview
Ask Learn is an AI assistant that can answer questions, clarify concepts, and define terms using trusted Microsoft documentation.
Please sign in to use Ask Learn.
Sign inThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Couple of times I got a question to <Enable or Disable “Enable write caching on disk” behavior on disk>, How to do it programmatically on Windows? When I got this question for the first time, it was tough but doing research I was able to solve it and it works well. Every next time, it was easy :)
In this post, I will not discuss what exactly this feature does and pros and cons of enable/disable it. I will only discuss, How to do it.
You can do it manually as well.
#1, Select a volume from Explorer, right click –> Properties
#2, Select “Hardware” tab, select disk and click “Properties” button
#3, Select “Policies” tab.
#4, Check/Uncheck to enable/disable “write caching on the disk”
To do it programmatically.
#1, You will need to work with below APIs and control code.
DISK_CACHE_INFORMATION Structure
IOCTL_DISK_GET_CACHE_INFORMATION Control Code
IOCTL_DISK_SET_CACHE_INFORMATION Control Code
The information is actually gets stored in below registry key, I would not recommend to look for the value in the key directly and design your application on that. It may change in future.
HKLM\SYSTEM\CurrentControlSet\Enum\IDE\Diskxxxxxxxxxxxx\DeviceParameters\Disk
Key : UserWriteCacheSetting
where xxxxxxx is manufacturer information.
The sample will look like below. This is just a test sample and provided only to demonstrate the functionality. You might need to use put more error handling and test the code as you do for regular production environment code.
1: //////////////////////SAMPLE CODE
2: ///////////////////////////////////////////////////////////
3: #define _WIN32_WINNT 0x0503
4:
5: #include <windows.h>
6:
7: DISK_CACHE_INFORMATION info;
8: DISK_CACHE_INFORMATION rinfo;
9:
10:
11: void main(void)
12: {
13: DWORD rr;
14: HANDLE hDevice;
15: DWORD err;
16: DWORD returned;
17:
18: hDevice = CreateFile("\\\\.\\C:", // drive to open
19: GENERIC_READ | GENERIC_WRITE,
20: FILE_SHARE_WRITE | FILE_SHARE_READ,
21: // share mode
22: NULL, // default security attributes
23: OPEN_EXISTING, // disposition
24: FILE_ATTRIBUTE_SYSTEM, // file attributes
25: NULL); // do not copy file attributes
26: if(hDevice==INVALID_HANDLE_VALUE)
27: {
28: return;
29: }
30:
31: rr = DeviceIoControl(hDevice,IOCTL_DISK_GET_CACHE_INFORMATION,NULL,
32: 0,(LPVOID)&info,(DWORD)sizeof(info),(LPDWORD)&returned, (LPOVERLAPPED)NULL);
33: if (!rr)
34: {
35: err = GetLastError();
36: return;
37: }
38:
39: info.WriteCacheEnabled = true;
40: info.ReadCacheEnabled = false;
41: info.DisablePrefetchTransferLength = 1;
42:
43: rr = DeviceIoControl(hDevice,IOCTL_DISK_SET_CACHE_INFORMATION,(LPVOID)&info,(DWORD)sizeof(info),
44: NULL,0,(LPDWORD)&returned,(LPOVERLAPPED)NULL);
45: if (!rr)
46: {
47: err = GetLastError();
48: return;
49: }
50:
51: rr = DeviceIoControl(hDevice,IOCTL_DISK_GET_CACHE_INFORMATION,NULL,0,
52: (LPVOID)&rinfo,(DWORD)sizeof(rinfo),(LPDWORD)&returned,(LPOVERLAPPED)NULL);
53: if (!rr)
54: {
55: err = GetLastError();
56: return;
57: }
58:
59: CloseHandle(hDevice);
60: }
61: //////////////////////SAMPLE CODE
62: ///////////////////////////////////////////////////////////
*Note—Not all disks and controllers implements write disk caching, I have not tested the behavior or any such disk yet, so behavior is unknown to me.
Nitin Dhawan
Windows SDK - Microsoft
Ask Learn is an AI assistant that can answer questions, clarify concepts, and define terms using trusted Microsoft documentation.
Please sign in to use Ask Learn.
Sign in