I want to put some sort of “hook” into windows (only has to work on Windows Server 2008 R2 and above) which when I ask for a file on disk and it’s not there it then requests it from a web server and caches it locally.
The files are immutable and have unique file names.
The application which is trying to open these files is written in C and just opens a file using the operating system in the normal way. Say it calls OpenFile asking for c:\scripts\1234.12.script, and that is there then it will just open it normally. If then it asks for c:\scripts\1234.13.script and it isn’t then my hook in the operating system will then go and ask my web service for the file, download it and then return that file as it it were there all the time.
I’d prefer to write this as a usermode process (I’ve never written a windows driver), it should only fire when files are not found in a specific folder, and I’d prefer if possible to write it in a managed language (C# would be perfect). The files are small (< 50kB) and the web service is fast and the internet connection blinding so I’m not expecting it to take more than a second to download the file.
My question is – where do I start looking for information about this kind of thing? And if anyone has done anything similar – do you know what options I have (eg can it be done in C#?)?
You would need to create a kernel-mode filesystem filter driver which would intercept requests for opening such files and would “fake” those files. I should say that this is a very complicated task even for driver development. Our CallbackFilter product would be able to solve your problem however mechanism for “faking” files is not yet ready (we plan this feature for CallbackFilter 3). Until then I don’t know any user-mode solutions (frankly speaking, no kernel-mode solutions as well) that would solve your problem.
If you can change the folder the application is accessing, then you can create a virtual file system and map it to the drive letter or a folder on NTFS drive. From the virtual file system you can direct most requests to/from real disk and if the file doesn’t exist, you can download the file and cache it. Our other product, Callback File System, lets you do what I described in user-mode. If you have a one-time task you need to accomplish, and don’t have a budget for it, please contact us anyway and maybe we can find some solution. There also exists an open-source solution with similar (but not so comprehensive) functionality named Dokan, yet I will refrain from commenting on its quality.