holz
asked on
Notification on disk access
Hy!
I'd like my software to get a notification each time the system
accesses (reads or writes) a hard disk or network drive.
DeviceIoControl / IOCTL_DISK_PERFORMANCE seems to be a way to
poll that information, but I can't open a handle to a disk drive
under Win95. It just doesn't work.
I'd like my software to get a notification each time the system
accesses (reads or writes) a hard disk or network drive.
DeviceIoControl / IOCTL_DISK_PERFORMANCE seems to be a way to
poll that information, but I can't open a handle to a disk drive
under Win95. It just doesn't work.
Don't forget that when you use DeviceIoControl in that matter, you're communicating with VWIN32.VXD, not with the drive! You are simulating int 21h and therefore, arguments must be different then the documented ones.
For more documentation and sample code see:
http://www.dejanews.com/getdoc.xp?AN=207816158
http://www.dejanews.com/getdoc.xp?AN=211688212
http://www.microsoft.com/kb/articles/q168/1/80.htm
http://www.microsoft.com/kb/articles/q163/9/20.htm
For more documentation and sample code see:
http://www.dejanews.com/getdoc.xp?AN=207816158
http://www.dejanews.com/getdoc.xp?AN=211688212
http://www.microsoft.com/kb/articles/q168/1/80.htm
http://www.microsoft.com/kb/articles/q163/9/20.htm
ASKER
Thanks, but this still leaves questions open:
1. When I open the driver instead of the HD, how do I tell the system which drive I want
to have information about? IOCTL_DISK_PERFORMANCE doesn't acceppt ANY
input variables.
2. Some article from the KB suggested that IOCTL_* functions are not available under
Windows 95. Sorry, I can't find that article any more. But: Is it true and is there
another way to query how many bytes were read from a certain drive until now?
1. When I open the driver instead of the HD, how do I tell the system which drive I want
to have information about? IOCTL_DISK_PERFORMANCE doesn't acceppt ANY
input variables.
2. Some article from the KB suggested that IOCTL_* functions are not available under
Windows 95. Sorry, I can't find that article any more. But: Is it true and is there
another way to query how many bytes were read from a certain drive until now?
Nonono!!!!
You do *not* use IOCTL_DISK_PERFORMANCE. You simulate the int 21h IOCTL function with the correct parameters. See the first two URLs I provided for samples (by Raymond Chen from MS).
You do *not* use IOCTL_DISK_PERFORMANCE. You simulate the int 21h IOCTL function with the correct parameters. See the first two URLs I provided for samples (by Raymond Chen from MS).
ASKER
"You simulate the int 21h IOCTL function with the correct parameters." sounds nice, but I can't find an interrupt doing the same work as IOCTL_DISK_PERFORMANCE would. Are you sure it does exist?
There is a set of functions under the WIN32 API that can notify you when disk stuff hapens. Look up:
FindFirstChangeNotificatio n
I'm not sure it's exactly what you want, but it might help.
(I got a simple demo program, lemme know if you want it)
FindFirstChangeNotificatio
I'm not sure it's exactly what you want, but it might help.
(I got a simple demo program, lemme know if you want it)
There is a set of functions under the WIN32 API that can notify you when disk stuff hapens. Look up:
FindFirstChangeNotificatio n
I'm not sure it's exactly what you want, but it might help.
(I got a simple demo program, lemme know if you want it)
FindFirstChangeNotificatio
I'm not sure it's exactly what you want, but it might help.
(I got a simple demo program, lemme know if you want it)
OK, holz, the bad news:
1. IOCTL_DISK_PERFORMANCE is supported only under NT.
2. There is *absolutely* no VWIN32 or INT 21h equivalent (according to Ralf Brown's interrupt list, MSDN and other sources of information).
You could get the Win95 DDK and check if a custom VxD could do it but I doubt it.
FindFirstChangeNotificatio n() will let you monitor file/directory changes in a subtree but not more than that.
I guess that the answer is, regretfully, that it cannot be done [at least without a custom VxD].
1. IOCTL_DISK_PERFORMANCE is supported only under NT.
2. There is *absolutely* no VWIN32 or INT 21h equivalent (according to Ralf Brown's interrupt list, MSDN and other sources of information).
You could get the Win95 DDK and check if a custom VxD could do it but I doubt it.
FindFirstChangeNotificatio
I guess that the answer is, regretfully, that it cannot be done [at least without a custom VxD].
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks, I'd already given up.
sprinkmeier, I would like to obtain your demoprogram if that's ok.. My Email is Jonathan.James@home.se
Thankyou
Regards
Jonathan James
"advanced VB programmer, converting to C++" :D
Thankyou
Regards
Jonathan James
"advanced VB programmer, converting to C++" :D
In Win95 you need to open the handle not to the logical device, but instead to a VXD. Therefore, you need to specify "\\\\.\\vwin32" in a call to CreateFile(), to specify the system vxd, VWIN32.VXD, which supports the input and output control (IOCTL) functions originally provided by MS-DOS Interrupt 21h. At that point you can either call DeviceIOControl or call int21 directly.
The article http://support.microsoft.com/support/kb/articles/q163/9/20.asp gives an example of how to open the floppy and query its device characteristics under Win95.
HANDLE pFile;
pFile = CreateFile("\\\\.\\vwin32"
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL );
Use this example for the floppy for any disk drive device under windows 95.