HID requires buffer length to be exactly the "size of the input report + 1". The first byte in the buffer must be set to 0 prior to calling. Otherwise it won't work. The file read will copy the report into the buffer starting from the second byte.
I'm not sure C# call will convey all the parameters to the underlying "ReadFile" call exactly as you specify them. If not, you will need to call "ReadFile" directly.
This is whats doing my nut in... In another HID example they use ReadFile slightly differently.. I can set the Write function to data.length -1 but the flush fails... I will try your changes and get back to you