|
|
1.1 ! root 1: /************************** MODULE HEADER ********************************** ! 2: * hndcopy.c ! 3: * Module to allow copying of file data using handles. ! 4: * ! 5: * ! 6: * Copyright (C) 1992 Microsoft Corporation ! 7: * ! 8: ***************************************************************************/ ! 9: ! 10: #include <windows.h> ! 11: ! 12: ! 13: /************************** Function Header ******************************** ! 14: * lFInCopy ! 15: * Copy the file contents of the input handle to that of the output ! 16: * handle. Copy is limited to the number of bytes passed in. ! 17: * ! 18: * RETURNS: ! 19: * Number of bytes copied, -1 on error, 0 is legitimate. ! 20: * ! 21: * HISTORY: ! 22: * 13:20 on Tue 25 Feb 1992 -by- Lindsay Harris [lindsayh] ! 23: * Based on lFICopy ! 24: * ! 25: ***************************************************************************/ ! 26: ! 27: ! 28: long ! 29: lFInCopy( hOut, hIn, lCount ) ! 30: HANDLE hOut; /* Output file: write to current position */ ! 31: HANDLE hIn; /* Input file: copy from current position to EOF */ ! 32: long lCount; /* Number of bytes to copy */ ! 33: { ! 34: ! 35: /* ! 36: * Simple read/write operations until EOF is reached on the input. ! 37: * May also be errors, so handle these too. As we are dealing with ! 38: * relatively small files (a few 10s of k), we use a stack buffer. ! 39: */ ! 40: ! 41: #define CPBSZ 2048 ! 42: ! 43: DWORD dwSize; ! 44: DWORD dwGot; ! 45: DWORD dwTot; /* Accumulate number of bytes copied */ ! 46: DWORD dwLeft; /* Number of bytes remaining */ ! 47: ! 48: BYTE ajBuf[ CPBSZ ]; ! 49: ! 50: if( lCount < 0 ) ! 51: return 0; /* Can't copy the other direction! */ ! 52: ! 53: ! 54: dwTot = 0; ! 55: dwLeft = lCount; ! 56: ! 57: while( dwLeft > 0 ) ! 58: { ! 59: dwSize = dwLeft > CPBSZ ? CPBSZ : dwLeft; ! 60: ! 61: if( !ReadFile( hIn, &ajBuf, dwSize, &dwGot, NULL ) ) ! 62: return -1; /* Bad news on error */ ! 63: ! 64: /* A read of zero means we have reached EOF */ ! 65: ! 66: if( dwGot == 0 ) ! 67: return dwTot; /* However much so far */ ! 68: ! 69: dwLeft -= dwGot; /* Adjuest the remainder */ ! 70: ! 71: if( !WriteFile( hOut, &ajBuf, dwGot, &dwSize, NULL ) || ! 72: dwSize != dwGot ) ! 73: { ! 74: /* Assume some serious problem */ ! 75: ! 76: return -1; ! 77: } ! 78: ! 79: dwTot += dwSize; ! 80: } ! 81: ! 82: /* ! 83: * We only come here after reading the desired amount. ! 84: */ ! 85: ! 86: return dwTot; ! 87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.