private static unsafe int WriteFileNative(SafeFileHandle hFile, byte[] bytes, int offset, int count, int mustBeZero, out int errorCode) {
BCLDebug.Assert(offset >= 0, "offset >= 0");
BCLDebug.Assert(count >= 0, "count >= 0");
BCLDebug.Assert(bytes != null, "bytes != null");
BCLDebug.Assert(bytes.Length >= offset + count, "bytes.Length >= offset + count");
// You can't use the fixed statement on an array of length 0.
if (bytes.Length==0) {
errorCode = 0;
return 0;
}
int numBytesWritten = 0;
int r;
fixed(byte* p = bytes) {
r = WriteFile(hFile, p + offset, count, out numBytesWritten, Win32Native.NULL);
}
if (r==0) {
errorCode = Marshal.GetLastWin32Error();
if (errorCode==ERROR_NO_DATA || errorCode==ERROR_BROKEN_PIPE)
return 0;
return -1;
}
else {
errorCode = 0;
}
return numBytesWritten;
}