/* Chapter 1. Basic cp file copy program. Win32 Implementation. */
/* cpW file1 file2: Copy file1 to file2. */
#include <windows.h>
#include <stdio.h>
#include <assert.h>
#define BUF_SIZE 16384 /* Optimal in several experiments. Small values such as 256 give very bad performance */
int main(int argc, LPTSTR argv[])
{
HANDLE hIn, hOut;
DWORD nIn, nOut;
CHAR buffer[BUF_SIZE] = {0};
if (argc != 3) {
fprintf(stderr
, "Usage: cp file1 file2\n"); return 1;
}
hOut = CreateFile(argv[2], GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hOut == INVALID_HANDLE_VALUE) {
fprintf(stderr
, "Cannot open output file. Error: %x\n", GetLastError
()); return -1;
}
WriteFile(hOut, buffer, 1, &nOut, NULL);
CloseHandle(hOut);
hIn = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hIn == INVALID_HANDLE_VALUE) {
fprintf(stderr
, "Cannot open input file. Error: %x\n", GetLastError
()); return 2;
}
hOut = CreateFile(argv[2], GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hOut == INVALID_HANDLE_VALUE) {
fprintf(stderr
, "Cannot open output file. Error: %x\n", GetLastError
()); CloseHandle(hIn);
return 3;
}
while (ReadFile(hIn, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0) {
WriteFile(hOut, buffer, nIn, &nOut, NULL);
if (nIn != nOut) {
fprintf(stderr
, "Fatal write error: %x\n", GetLastError
()); CloseHandle(hIn); CloseHandle(hOut);
return 4;
}
}
CloseHandle(hIn);
CloseHandle(hOut);
return 0;
}
LyogQ2hhcHRlciAxLiBCYXNpYyBjcCBmaWxlIGNvcHkgcHJvZ3JhbS4gV2luMzIgSW1wbGVtZW50YXRpb24uICovCi8qIGNwVyBmaWxlMSBmaWxlMjogQ29weSBmaWxlMSB0byBmaWxlMi4gKi8KCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNkZWZpbmUgQlVGX1NJWkUgMTYzODQgIC8qIE9wdGltYWwgaW4gc2V2ZXJhbCBleHBlcmltZW50cy4gU21hbGwgdmFsdWVzIHN1Y2ggYXMgMjU2IGdpdmUgdmVyeSBiYWQgcGVyZm9ybWFuY2UgKi8KCmludCBtYWluKGludCBhcmdjLCBMUFRTVFIgYXJndltdKQp7CglIQU5ETEUgaEluLCBoT3V0OwoJRFdPUkQgbkluLCBuT3V0OwoJQ0hBUiBidWZmZXJbQlVGX1NJWkVdID0gezB9OwoJaWYgKGFyZ2MgIT0gMykgewoJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGNwIGZpbGUxIGZpbGUyXG4iKTsKCQlyZXR1cm4gMTsKCX0KCWhPdXQgPSBDcmVhdGVGaWxlKGFyZ3ZbMl0sIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsCgkJQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKCWlmIChoT3V0ID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CgkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZS4gRXJyb3I6ICV4XG4iLCBHZXRMYXN0RXJyb3IoKSk7CgkJcmV0dXJuIC0xOwoJfQoJV3JpdGVGaWxlKGhPdXQsIGJ1ZmZlciwgMSwgJm5PdXQsIE5VTEwpOwoJYXNzZXJ0KG5PdXQgPT0gMSk7CglDbG9zZUhhbmRsZShoT3V0KTsKCWhJbiA9IENyZWF0ZUZpbGUoYXJndlsxXSwgR0VORVJJQ19SRUFELCBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsCgkJT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKCWlmIChoSW4gPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUuIEVycm9yOiAleFxuIiwgR2V0TGFzdEVycm9yKCkpOwoJCXJldHVybiAyOwoJfQoKCWhPdXQgPSBDcmVhdGVGaWxlKGFyZ3ZbMl0sIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsCgkJQ1JFQVRFX0FMV0FZUywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKCWlmIChoT3V0ID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CgkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZS4gRXJyb3I6ICV4XG4iLCBHZXRMYXN0RXJyb3IoKSk7CgkJQ2xvc2VIYW5kbGUoaEluKTsKCQlyZXR1cm4gMzsKCX0KCXdoaWxlIChSZWFkRmlsZShoSW4sIGJ1ZmZlciwgQlVGX1NJWkUsICZuSW4sIE5VTEwpICYmIG5JbiA+IDApIHsKCQlXcml0ZUZpbGUoaE91dCwgYnVmZmVyLCBuSW4sICZuT3V0LCBOVUxMKTsKCQlpZiAobkluICE9IG5PdXQpIHsKCQkJZnByaW50ZihzdGRlcnIsICJGYXRhbCB3cml0ZSBlcnJvcjogJXhcbiIsIEdldExhc3RFcnJvcigpKTsKCQkJQ2xvc2VIYW5kbGUoaEluKTsgQ2xvc2VIYW5kbGUoaE91dCk7CgkJCXJldHVybiA0OwoJCX0KCX0KCUNsb3NlSGFuZGxlKGhJbik7CglDbG9zZUhhbmRsZShoT3V0KTsKCXJldHVybiAwOwp9Cg==