dmloader: complete rewrite and full implementation.
[wine] / dlls / kernel / tests / file.c
1 /*
2  * Unit tests for file functions in Wine
3  *
4  * Copyright (c) 2002, 2004 Jakob Eriksson
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #include <stdarg.h>
23 #include <stdlib.h>
24 #include <time.h>
25
26 #include "wine/test.h"
27 #include "windef.h"
28 #include "winbase.h"
29 #include "winerror.h"
30
31 static int dll_capable(const char *dll, const char *function)
32 {
33     HMODULE module = GetModuleHandleA(dll);
34     if (!module) return 0;
35
36     return (GetProcAddress(module, function) != NULL);
37 }
38
39
40 LPCSTR filename = "testfile.xxx";
41 LPCSTR sillytext =
42 "en larvig liten text dx \033 gx hej 84 hej 4484 ! \001\033 bla bl\na.. bla bla."
43 "1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3"
44 "1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3"
45 "1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3"
46 "1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3"
47 "1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3"
48 "1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3"
49 "1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3"
50 "1234 43 4kljf lf &%%%&&&&&& 34 4 34   3############# 33 3 3 3 # 3## 3"
51 "sdlkfjasdlkfj a dslkj adsklf  \n  \nasdklf askldfa sdlkf \nsadklf asdklf asdf ";
52
53
54 static void test__hread( void )
55 {
56     HFILE filehandle;
57     char buffer[10000];
58     long bytes_read;
59     long bytes_wanted;
60     long i;
61
62     SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL); /* be sure to remove stale files */
63     DeleteFileA( filename );
64     filehandle = _lcreat( filename, 0 );
65     if (filehandle == HFILE_ERROR)
66     {
67         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
68         return;
69     }
70
71     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
72
73     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
74
75     filehandle = _lopen( filename, OF_READ );
76
77     ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)\n", filename, GetLastError(  ) );
78
79     bytes_read = _hread( filehandle, buffer, 2 * strlen( sillytext ) );
80
81     ok( lstrlenA( sillytext ) == bytes_read, "file read size error\n" );
82
83     for (bytes_wanted = 0; bytes_wanted < lstrlenA( sillytext ); bytes_wanted++)
84     {
85         ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
86         ok( _hread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value\n" );
87         for (i = 0; i < bytes_wanted; i++)
88         {
89             ok( buffer[i] == sillytext[i], "that's not what's written\n" );
90         }
91     }
92
93     ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
94
95     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
96 }
97
98
99 static void test__hwrite( void )
100 {
101     HFILE filehandle;
102     char buffer[10000];
103     long bytes_read;
104     long bytes_written;
105     long blocks;
106     long i;
107     char *contents;
108     HLOCAL memory_object;
109     char checksum[1];
110
111     filehandle = _lcreat( filename, 0 );
112     if (filehandle == HFILE_ERROR)
113     {
114         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
115         return;
116     }
117
118     ok( HFILE_ERROR != _hwrite( filehandle, "", 0 ), "_hwrite complains\n" );
119
120     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
121
122     filehandle = _lopen( filename, OF_READ );
123
124     bytes_read = _hread( filehandle, buffer, 1);
125
126     ok( 0 == bytes_read, "file read size error\n" );
127
128     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
129
130     filehandle = _lopen( filename, OF_READWRITE );
131
132     bytes_written = 0;
133     checksum[0] = '\0';
134     srand( (unsigned)time( NULL ) );
135     for (blocks = 0; blocks < 100; blocks++)
136     {
137         for (i = 0; i < (long)sizeof( buffer ); i++)
138         {
139             buffer[i] = rand(  );
140             checksum[0] = checksum[0] + buffer[i];
141         }
142         ok( HFILE_ERROR != _hwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains\n" );
143         bytes_written = bytes_written + sizeof( buffer );
144     }
145
146     ok( HFILE_ERROR != _hwrite( filehandle, checksum, 1 ), "_hwrite complains\n" );
147     bytes_written++;
148
149     ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
150
151     memory_object = LocalAlloc( LPTR, bytes_written );
152
153     ok( 0 != memory_object, "LocalAlloc fails. (Could be out of memory.)\n" );
154
155     contents = LocalLock( memory_object );
156
157     filehandle = _lopen( filename, OF_READ );
158
159     contents = LocalLock( memory_object );
160
161     ok( NULL != contents, "LocalLock whines\n" );
162
163     ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length\n" );
164
165     checksum[0] = '\0';
166     i = 0;
167     do
168     {
169         checksum[0] = checksum[0] + contents[i];
170         i++;
171     }
172     while (i < bytes_written - 1);
173
174     ok( checksum[0] == contents[i], "stored checksum differ from computed checksum\n" );
175
176     ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
177
178     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
179 }
180
181
182 static void test__lclose( void )
183 {
184     HFILE filehandle;
185
186     filehandle = _lcreat( filename, 0 );
187     if (filehandle == HFILE_ERROR)
188     {
189         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
190         return;
191     }
192
193     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
194
195     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
196
197     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
198 }
199
200
201 static void test__lcreat( void )
202 {
203     HFILE filehandle;
204     char buffer[10000];
205     WIN32_FIND_DATAA search_results;
206     char slashname[] = "testfi/";
207     int err;
208     HANDLE find;
209
210     filehandle = _lcreat( filename, 0 );
211     if (filehandle == HFILE_ERROR)
212     {
213         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
214         return;
215     }
216
217     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
218
219     ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
220
221     ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value\n" );
222
223     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
224
225     ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file\n" );
226
227     ok( DeleteFileA(filename) != 0, "DeleteFile failed (%ld)\n", GetLastError());
228
229     filehandle = _lcreat( filename, 1 ); /* readonly */
230     ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError(  ) );
231
232     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write never the less\n" );
233
234     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
235
236     ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file\n" );
237
238     ok( 0 == DeleteFileA( filename ), "shouldn't be able to delete a readonly file\n" );
239
240     ok( SetFileAttributesA(filename, FILE_ATTRIBUTE_NORMAL ) != 0, "couldn't change attributes on file\n" );
241
242     ok( DeleteFileA( filename ) != 0, "now it should be possible to delete the file!\n" );
243
244     filehandle = _lcreat( filename, 2 );
245     ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError(  ) );
246
247     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
248
249     ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
250
251     ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value\n" );
252
253     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
254
255     ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file\n" );
256
257     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
258
259     filehandle = _lcreat( filename, 4 ); /* SYSTEM file */
260     ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError(  ) );
261
262     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
263
264     ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
265
266     ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value\n" );
267
268     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
269
270     ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file\n" );
271
272     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
273
274     filehandle=_lcreat (slashname, 0); /* illegal name */
275     if (HFILE_ERROR==filehandle) {
276       err=GetLastError ();
277       ok (err==ERROR_INVALID_NAME || err==ERROR_PATH_NOT_FOUND,
278           "creating file \"%s\" failed with error %d\n", slashname, err);
279     } else { /* only NT succeeds */
280       _lclose(filehandle);
281       find=FindFirstFileA (slashname, &search_results);
282       if (INVALID_HANDLE_VALUE!=find)
283       {
284         ok (0!=FindClose (find), "FindClose complains (%ld)\n", GetLastError ());
285         slashname[strlen(slashname)-1]=0;
286         ok (!strcmp (slashname, search_results.cFileName),
287             "found unexpected name \"%s\"\n", search_results.cFileName);
288         ok (FILE_ATTRIBUTE_ARCHIVE==search_results.dwFileAttributes,
289             "attributes of file \"%s\" are 0x%04lx\n", search_results.cFileName,
290             search_results.dwFileAttributes);
291       }
292       ok (0!=DeleteFileA (slashname), "Can't delete \"%s\" (%ld)\n", slashname,
293           GetLastError ());
294     }
295
296     filehandle=_lcreat (filename, 8); /* illegal attribute */
297     if (HFILE_ERROR==filehandle)
298       ok (0, "couldn't create volume label \"%s\"\n", filename);
299     else {
300       _lclose(filehandle);
301       find=FindFirstFileA (filename, &search_results);
302       if (INVALID_HANDLE_VALUE==find)
303         ok (0, "file \"%s\" not found\n", filename);
304       else {
305         ok (0!=FindClose (find), "FindClose complains (%ld)\n", GetLastError ());
306         ok (!strcmp (filename, search_results.cFileName),
307             "found unexpected name \"%s\"\n", search_results.cFileName);
308         ok (FILE_ATTRIBUTE_ARCHIVE==search_results.dwFileAttributes,
309             "attributes of file \"%s\" are 0x%04lx\n", search_results.cFileName,
310             search_results.dwFileAttributes);
311       }
312       ok (0!=DeleteFileA (filename), "Can't delete \"%s\" (%ld)\n", slashname,
313           GetLastError ());
314     }
315 }
316
317
318 static void test__llseek( void )
319 {
320     INT i;
321     HFILE filehandle;
322     char buffer[1];
323     long bytes_read;
324
325     filehandle = _lcreat( filename, 0 );
326     if (filehandle == HFILE_ERROR)
327     {
328         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
329         return;
330     }
331
332     for (i = 0; i < 400; i++)
333     {
334         ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
335     }
336     ok( HFILE_ERROR != _llseek( filehandle, 400 * strlen( sillytext ), FILE_CURRENT ), "should be able to seek\n" );
337     ok( HFILE_ERROR != _llseek( filehandle, 27 + 35 * strlen( sillytext ), FILE_BEGIN ), "should be able to seek\n" );
338
339     bytes_read = _hread( filehandle, buffer, 1);
340     ok( 1 == bytes_read, "file read size error\n" );
341     ok( buffer[0] == sillytext[27], "_llseek error, it got lost seeking\n" );
342     ok( HFILE_ERROR != _llseek( filehandle, -400 * strlen( sillytext ), FILE_END ), "should be able to seek\n" );
343
344     bytes_read = _hread( filehandle, buffer, 1);
345     ok( 1 == bytes_read, "file read size error\n" );
346     ok( buffer[0] == sillytext[0], "_llseek error, it got lost seeking\n" );
347     ok( HFILE_ERROR != _llseek( filehandle, 1000000, FILE_END ), "should be able to seek past file; poor, poor Windows programmers\n" );
348     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
349
350     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
351 }
352
353
354 static void test__llopen( void )
355 {
356     HFILE filehandle;
357     UINT bytes_read;
358     char buffer[10000];
359
360     filehandle = _lcreat( filename, 0 );
361     if (filehandle == HFILE_ERROR)
362     {
363         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
364         return;
365     }
366
367     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
368     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
369
370     filehandle = _lopen( filename, OF_READ );
371     ok( HFILE_ERROR == _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write!\n" );
372     bytes_read = _hread( filehandle, buffer, strlen( sillytext ) );
373     ok( strlen( sillytext )  == bytes_read, "file read size error\n" );
374     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
375
376     filehandle = _lopen( filename, OF_READWRITE );
377     bytes_read = _hread( filehandle, buffer, 2 * strlen( sillytext ) );
378     ok( strlen( sillytext )  == bytes_read, "file read size error\n" );
379     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine\n" );
380     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
381
382     filehandle = _lopen( filename, OF_WRITE );
383     ok( HFILE_ERROR == _hread( filehandle, buffer, 1 ), "you should only be able to write this file\n" );
384     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine\n" );
385     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
386
387     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
388     /* TODO - add tests for the SHARE modes  -  use two processes to pull this one off */
389 }
390
391
392 static void test__lread( void )
393 {
394     HFILE filehandle;
395     char buffer[10000];
396     long bytes_read;
397     UINT bytes_wanted;
398     UINT i;
399
400     filehandle = _lcreat( filename, 0 );
401     if (filehandle == HFILE_ERROR)
402     {
403         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
404         return;
405     }
406
407     ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
408
409     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
410
411     filehandle = _lopen( filename, OF_READ );
412
413     ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)\n", filename, GetLastError());
414
415     bytes_read = _lread( filehandle, buffer, 2 * strlen( sillytext ) );
416
417     ok( lstrlenA( sillytext ) == bytes_read, "file read size error\n" );
418
419     for (bytes_wanted = 0; bytes_wanted < strlen( sillytext ); bytes_wanted++)
420     {
421         ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
422         ok( _lread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value\n" );
423         for (i = 0; i < bytes_wanted; i++)
424         {
425             ok( buffer[i] == sillytext[i], "that's not what's written\n" );
426         }
427     }
428
429     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
430
431     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
432 }
433
434
435 static void test__lwrite( void )
436 {
437     HFILE filehandle;
438     char buffer[10000];
439     long bytes_read;
440     long bytes_written;
441     long blocks;
442     long i;
443     char *contents;
444     HLOCAL memory_object;
445     char checksum[1];
446
447     filehandle = _lcreat( filename, 0 );
448     if (filehandle == HFILE_ERROR)
449     {
450         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
451         return;
452     }
453
454     ok( HFILE_ERROR != _lwrite( filehandle, "", 0 ), "_hwrite complains\n" );
455
456     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
457
458     filehandle = _lopen( filename, OF_READ );
459
460     bytes_read = _hread( filehandle, buffer, 1);
461
462     ok( 0 == bytes_read, "file read size error\n" );
463
464     ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
465
466     filehandle = _lopen( filename, OF_READWRITE );
467
468     bytes_written = 0;
469     checksum[0] = '\0';
470     srand( (unsigned)time( NULL ) );
471     for (blocks = 0; blocks < 100; blocks++)
472     {
473         for (i = 0; i < (long)sizeof( buffer ); i++)
474         {
475             buffer[i] = rand(  );
476             checksum[0] = checksum[0] + buffer[i];
477         }
478         ok( HFILE_ERROR != _lwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains\n" );
479         bytes_written = bytes_written + sizeof( buffer );
480     }
481
482     ok( HFILE_ERROR != _lwrite( filehandle, checksum, 1 ), "_hwrite complains\n" );
483     bytes_written++;
484
485     ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
486
487     memory_object = LocalAlloc( LPTR, bytes_written );
488
489     ok( 0 != memory_object, "LocalAlloc fails, could be out of memory\n" );
490
491     contents = LocalLock( memory_object );
492
493     filehandle = _lopen( filename, OF_READ );
494
495     contents = LocalLock( memory_object );
496
497     ok( NULL != contents, "LocalLock whines\n" );
498
499     ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length\n" );
500
501     checksum[0] = '\0';
502     i = 0;
503     do
504     {
505         checksum[0] += contents[i];
506         i++;
507     }
508     while (i < bytes_written - 1);
509
510     ok( checksum[0] == contents[i], "stored checksum differ from computed checksum\n" );
511
512     ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
513
514     ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
515 }
516
517 static void test_CopyFileA(void)
518 {
519     char temp_path[MAX_PATH];
520     char source[MAX_PATH], dest[MAX_PATH];
521     static const char prefix[] = "pfx";
522     DWORD ret;
523
524     ret = GetTempPathA(MAX_PATH, temp_path);
525     ok(ret != 0, "GetTempPathA error %ld\n", GetLastError());
526     ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
527
528     ret = GetTempFileNameA(temp_path, prefix, 0, source);
529     ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
530
531     ret = GetTempFileNameA(temp_path, prefix, 0, dest);
532     ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
533
534     ret = CopyFileA(source, dest, TRUE);
535     ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
536        "CopyFileA: unexpected error %ld\n", GetLastError());
537
538     ret = CopyFileA(source, dest, FALSE);
539     ok(ret,  "CopyFileA: error %ld\n", GetLastError());
540
541     ret = DeleteFileA(source);
542     ok(ret, "DeleteFileA: error %ld\n", GetLastError());
543     ret = DeleteFileA(dest);
544     ok(ret, "DeleteFileA: error %ld\n", GetLastError());
545 }
546
547 static void test_CopyFileW(void)
548 {
549     WCHAR temp_path[MAX_PATH];
550     WCHAR source[MAX_PATH], dest[MAX_PATH];
551     static const WCHAR prefix[] = {'p','f','x',0};
552     DWORD ret;
553
554     ret = GetTempPathW(MAX_PATH, temp_path);
555     if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
556         return;
557     ok(ret != 0, "GetTempPathW error %ld\n", GetLastError());
558     ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
559
560     ret = GetTempFileNameW(temp_path, prefix, 0, source);
561     ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
562
563     ret = GetTempFileNameW(temp_path, prefix, 0, dest);
564     ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
565
566     ret = CopyFileW(source, dest, TRUE);
567     ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
568        "CopyFileW: unexpected error %ld\n", GetLastError());
569
570     ret = CopyFileW(source, dest, FALSE);
571     ok(ret,  "CopyFileW: error %ld\n", GetLastError());
572
573     ret = DeleteFileW(source);
574     ok(ret, "DeleteFileW: error %ld\n", GetLastError());
575     ret = DeleteFileW(dest);
576     ok(ret, "DeleteFileW: error %ld\n", GetLastError());
577 }
578
579 static void test_CreateFileA(void)
580 {
581     HANDLE hFile;
582     char temp_path[MAX_PATH];
583     char filename[MAX_PATH];
584     static const char prefix[] = "pfx";
585     DWORD ret;
586
587     ret = GetTempPathA(MAX_PATH, temp_path);
588     ok(ret != 0, "GetTempPathA error %ld\n", GetLastError());
589     ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
590
591     ret = GetTempFileNameA(temp_path, prefix, 0, filename);
592     ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
593
594     hFile = CreateFileA(filename, GENERIC_READ, 0, NULL,
595                         CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
596     ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS,
597         "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n");
598
599     ret = DeleteFileA(filename);
600     ok(ret, "DeleteFileA: error %ld\n", GetLastError());
601 }
602
603 static void test_CreateFileW(void)
604 {
605     HANDLE hFile;
606     WCHAR temp_path[MAX_PATH];
607     WCHAR filename[MAX_PATH];
608     static const WCHAR emptyW[]={'\0'};
609     static const WCHAR prefix[] = {'p','f','x',0};
610     DWORD ret;
611
612     ret = GetTempPathW(MAX_PATH, temp_path);
613     if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
614         return;
615     ok(ret != 0, "GetTempPathW error %ld\n", GetLastError());
616     ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
617
618     ret = GetTempFileNameW(temp_path, prefix, 0, filename);
619     ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
620
621     hFile = CreateFileW(filename, GENERIC_READ, 0, NULL,
622                         CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
623     ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS,
624         "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n");
625
626     ret = DeleteFileW(filename);
627     ok(ret, "DeleteFileW: error %ld\n", GetLastError());
628
629     hFile = CreateFileW(NULL, GENERIC_READ, 0, NULL,
630                         CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
631     ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND,
632        "CreateFileW(NULL) returned ret=%p error=%ld\n",hFile,GetLastError());
633
634     hFile = CreateFileW(emptyW, GENERIC_READ, 0, NULL,
635                         CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
636     ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND,
637        "CreateFileW(\"\") returned ret=%p error=%ld\n",hFile,GetLastError());
638 }
639
640 static void test_GetTempFileNameA()
641 {
642     UINT result;
643     char out[MAX_PATH];
644     char expected[MAX_PATH + 10];
645     char windowsdir[MAX_PATH + 10];
646     char windowsdrive[3];
647
648     result = GetWindowsDirectory(windowsdir, sizeof(windowsdir));
649     ok(result < sizeof(windowsdir), "windowsdir is abnormally long!\n");
650     ok(result != 0, "GetWindowsDirectory: error %ld\n", GetLastError());
651
652     /* If the Windows directory is the root directory, it ends in backslash, not else. */
653     if (strlen(windowsdir) != 3) /* As in  "C:\"  or  "F:\"  */
654     {
655         strcat(windowsdir, "\\");
656     }
657
658     windowsdrive[0] = windowsdir[0];
659     windowsdrive[1] = windowsdir[1];
660     windowsdrive[2] = '\0';
661
662     result = GetTempFileNameA(windowsdrive, "abc", 1, out);
663     ok(result != 0, "GetTempFileNameA: error %ld\n", GetLastError());
664     ok(((out[0] == windowsdrive[0]) && (out[1] == ':')) && (out[2] == '\\'),
665        "GetTempFileNameA: first three characters should be %c:\\, string was actually %s\n",
666        windowsdrive[0], out);
667
668     result = GetTempFileNameA(windowsdir, "abc", 2, out);
669     ok(result != 0, "GetTempFileNameA: error %ld\n", GetLastError());
670     expected[0] = '\0';
671     strcat(expected, windowsdir);
672     strcat(expected, "abc2.tmp");
673     ok(lstrcmpiA(out, expected) == 0, "GetTempFileNameA: Unexpected output \"%s\" vs \"%s\"\n",
674        out, expected);
675 }
676
677 static void test_DeleteFileA( void )
678 {
679     BOOL ret;
680
681     ret = DeleteFileA(NULL);
682     ok(!ret && (GetLastError() == ERROR_INVALID_PARAMETER ||
683                 GetLastError() == ERROR_PATH_NOT_FOUND),
684        "DeleteFileA(NULL) returned ret=%d error=%ld\n",ret,GetLastError());
685
686     ret = DeleteFileA("");
687     ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND ||
688                 GetLastError() == ERROR_BAD_PATHNAME),
689        "DeleteFileA(\"\") returned ret=%d error=%ld\n",ret,GetLastError());
690
691     ret = DeleteFileA("nul");
692     ok(!ret && (GetLastError() == ERROR_FILE_NOT_FOUND ||
693                 GetLastError() == ERROR_INVALID_PARAMETER ||
694                 GetLastError() == ERROR_ACCESS_DENIED),
695        "DeleteFileA(\"nul\") returned ret=%d error=%ld\n",ret,GetLastError());
696 }
697
698 static void test_DeleteFileW( void )
699 {
700     BOOL ret;
701     static const WCHAR emptyW[]={'\0'};
702
703     ret = DeleteFileW(NULL);
704     if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
705         return;
706     ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND,
707        "DeleteFileW(NULL) returned ret=%d error=%ld\n",ret,GetLastError());
708
709     ret = DeleteFileW(emptyW);
710     ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND,
711        "DeleteFileW(\"\") returned ret=%d error=%ld\n",ret,GetLastError());
712 }
713
714 #define IsDotDir(x)     ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0))))
715
716 static void test_MoveFileA(void)
717 {
718     char tempdir[MAX_PATH];
719     char source[MAX_PATH], dest[MAX_PATH];
720     static const char prefix[] = "pfx";
721     DWORD ret;
722
723     ret = GetTempPathA(MAX_PATH, tempdir);
724     ok(ret != 0, "GetTempPathA error %ld\n", GetLastError());
725     ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
726
727     ret = GetTempFileNameA(tempdir, prefix, 0, source);
728     ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
729
730     ret = GetTempFileNameA(tempdir, prefix, 0, dest);
731     ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
732
733     ret = MoveFileA(source, dest);
734     ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS,
735        "MoveFileA: unexpected error %ld\n", GetLastError());
736
737     ret = DeleteFileA(dest);
738     ok(ret, "DeleteFileA: error %ld\n", GetLastError());
739
740     ret = MoveFileA(source, dest);
741     ok(ret, "MoveFileA: failed, error %ld\n", GetLastError());
742
743     lstrcatA(tempdir, "Remove Me");
744     ret = CreateDirectoryA(tempdir, NULL);
745     ok(ret == TRUE, "CreateDirectoryA failed\n");
746
747     lstrcpyA(source, dest);
748     lstrcpyA(dest, tempdir);
749     lstrcatA(dest, "\\wild?.*");
750     /* FIXME: if we create a file with wildcards we can't delete it now that DeleteFile works correctly */
751     ret = MoveFileA(source, dest);
752     ok(!ret, "MoveFileA: shouldn't move to wildcard file\n");
753     ok(GetLastError() == ERROR_INVALID_NAME,
754        "MoveFileA: with wildcards, unexpected error %ld\n", GetLastError());
755     if (ret || (GetLastError() != ERROR_INVALID_NAME))
756     {
757         WIN32_FIND_DATAA fd;
758         char temppath[MAX_PATH];
759         HANDLE hFind;
760
761         lstrcpyA(temppath, tempdir);
762         lstrcatA(temppath, "\\*.*");
763         hFind = FindFirstFileA(temppath, &fd);
764         if (INVALID_HANDLE_VALUE != hFind)
765         {
766           LPSTR lpName;
767           do
768           {
769             lpName = fd.cAlternateFileName;
770             if (!lpName[0])
771               lpName = fd.cFileName;
772             ok(IsDotDir(lpName), "MoveFileA: wildcards file created!\n");
773           }
774           while (FindNextFileA(hFind, &fd));
775           FindClose(hFind);
776         }
777     }
778     ret = DeleteFileA(source);
779     ok(ret, "DeleteFileA: error %ld\n", GetLastError());
780     ret = DeleteFileA(dest);
781     ok(!ret, "DeleteFileA: error %ld\n", GetLastError());
782     ret = RemoveDirectoryA(tempdir);
783     ok(ret, "DeleteDirectoryA: error %ld\n", GetLastError());
784 }
785
786 static void test_MoveFileW(void)
787 {
788     WCHAR temp_path[MAX_PATH];
789     WCHAR source[MAX_PATH], dest[MAX_PATH];
790     static const WCHAR prefix[] = {'p','f','x',0};
791     DWORD ret;
792
793     ret = GetTempPathW(MAX_PATH, temp_path);
794     if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
795         return;
796     ok(ret != 0, "GetTempPathW error %ld\n", GetLastError());
797     ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
798
799     ret = GetTempFileNameW(temp_path, prefix, 0, source);
800     ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
801
802     ret = GetTempFileNameW(temp_path, prefix, 0, dest);
803     ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
804
805     ret = MoveFileW(source, dest);
806     ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS,
807        "CopyFileW: unexpected error %ld\n", GetLastError());
808
809     ret = DeleteFileW(source);
810     ok(ret, "DeleteFileW: error %ld\n", GetLastError());
811     ret = DeleteFileW(dest);
812     ok(ret, "DeleteFileW: error %ld\n", GetLastError());
813 }
814
815 #define PATTERN_OFFSET 0x10
816
817 static void test_offset_in_overlapped_structure(void)
818 {
819     HANDLE hFile;
820     OVERLAPPED ov;
821     DWORD done;
822     BOOL rc;
823     BYTE buf[256], pattern[] = "TeSt";
824     UINT i;
825     char temp_path[MAX_PATH], temp_fname[MAX_PATH];
826
827     ok(GetTempPathA(MAX_PATH, temp_path) != 0, "GetTempPathA error %ld\n", GetLastError());
828     ok(GetTempFileNameA(temp_path, "pfx", 0, temp_fname) != 0, "GetTempFileNameA error %ld\n", GetLastError());
829
830     /*** Write File *****************************************************/
831
832     hFile = CreateFileA(temp_fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
833     ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA error %ld\n", GetLastError());
834
835     for(i = 0; i < sizeof(buf); i++) buf[i] = i;
836     ok(WriteFile(hFile, buf, sizeof(buf), &done, NULL), "WriteFile error %ld\n", GetLastError());
837     ok(done == sizeof(buf), "expected number of bytes written %lu\n", done);
838
839     memset(&ov, 0, sizeof(ov));
840     ov.Offset = PATTERN_OFFSET;
841     ov.OffsetHigh = 0;
842     rc=WriteFile(hFile, pattern, sizeof(pattern), &done, &ov);
843     /* Win 9x does not support the overlapped I/O on files */
844     if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) {
845         ok(rc, "WriteFile error %ld\n", GetLastError());
846         ok(done == sizeof(pattern), "expected number of bytes written %lu\n", done);
847         /*trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));*/
848         ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)),
849            "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern));
850
851         ov.Offset = sizeof(buf) * 2;
852         ov.OffsetHigh = 0;
853         ok(WriteFile(hFile, pattern, sizeof(pattern), &done, &ov), "WriteFile error %ld\n", GetLastError());
854         ok(done == sizeof(pattern), "expected number of bytes written %lu\n", done);
855         /*trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));*/
856         ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (sizeof(buf) * 2 + sizeof(pattern)),
857            "expected file offset %d\n", sizeof(buf) * 2 + sizeof(pattern));
858     }
859
860     CloseHandle(hFile);
861
862     /*** Read File *****************************************************/
863
864     hFile = CreateFileA(temp_fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
865     ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA error %ld\n", GetLastError());
866
867     memset(buf, 0, sizeof(buf));
868     memset(&ov, 0, sizeof(ov));
869     ov.Offset = PATTERN_OFFSET;
870     ov.OffsetHigh = 0;
871     rc=ReadFile(hFile, buf, sizeof(pattern), &done, &ov);
872     /* Win 9x does not support the overlapped I/O on files */
873     if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) {
874         ok(rc, "ReadFile error %ld\n", GetLastError());
875         ok(done == sizeof(pattern), "expected number of bytes read %lu\n", done);
876         /*trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));*/
877         ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)),
878            "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern));
879         ok(!memcmp(buf, pattern, sizeof(pattern)), "pattern match failed\n");
880     }
881
882     CloseHandle(hFile);
883
884     ok(DeleteFileA(temp_fname), "DeleteFileA error %ld\n", GetLastError());
885 }
886
887 static void test_LockFile(void)
888 {
889     HANDLE handle;
890     DWORD written;
891     OVERLAPPED overlapped;
892     int limited_LockFile;
893     int limited_UnLockFile;
894     int lockfileex_capable;
895
896     handle = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE,
897                           FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
898                           CREATE_ALWAYS, 0, 0 );
899     if (handle == INVALID_HANDLE_VALUE)
900     {
901         ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
902         return;
903     }
904     ok( WriteFile( handle, sillytext, strlen(sillytext), &written, NULL ), "write failed\n" );
905
906     ok( LockFile( handle, 0, 0, 0, 0 ), "LockFile failed\n" );
907     ok( UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile failed\n" );
908
909     limited_UnLockFile = 0;
910     if (UnlockFile( handle, 0, 0, 0, 0 ))
911     {
912         limited_UnLockFile = 1;
913     }
914
915     ok( LockFile( handle, 10, 0, 20, 0 ), "LockFile 10,20 failed\n" );
916     /* overlapping locks must fail */
917     ok( !LockFile( handle, 12, 0, 10, 0 ), "LockFile 12,10 succeeded\n" );
918     ok( !LockFile( handle, 5, 0, 6, 0 ), "LockFile 5,6 succeeded\n" );
919     /* non-overlapping locks must succeed */
920     ok( LockFile( handle, 5, 0, 5, 0 ), "LockFile 5,5 failed\n" );
921
922     ok( !UnlockFile( handle, 10, 0, 10, 0 ), "UnlockFile 10,10 succeeded\n" );
923     ok( UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 failed\n" );
924     ok( !UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 again succeeded\n" );
925     ok( UnlockFile( handle, 5, 0, 5, 0 ), "UnlockFile 5,5 failed\n" );
926
927     overlapped.Offset = 100;
928     overlapped.OffsetHigh = 0;
929     overlapped.hEvent = 0;
930
931     lockfileex_capable = dll_capable("kernel32", "LockFileEx");
932     if (lockfileex_capable)
933     {
934         /* Test for broken LockFileEx a la Windows 95 OSR2. */
935         if (LockFileEx( handle, 0, 0, 100, 0, &overlapped ))
936         {
937             /* LockFileEx is probably OK, test it more. */
938             ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ),
939                 "LockFileEx 100,100 failed\n" );
940         }
941     }
942
943     /* overlapping shared locks are OK */
944     overlapped.Offset = 150;
945     limited_UnLockFile || ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed\n" );
946
947     /* but exclusive is not */
948     if (lockfileex_capable)
949     {
950         ok( !LockFileEx( handle, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,
951                          0, 50, 0, &overlapped ),
952                          "LockFileEx exclusive 150,50 succeeded\n" );
953         if (dll_capable("kernel32.dll", "UnlockFileEx"))
954         {
955             if (!UnlockFileEx( handle, 0, 100, 0, &overlapped ))
956             { /* UnLockFile is capable. */
957                 overlapped.Offset = 100;
958                 ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ),
959                     "UnlockFileEx 150,100 again succeeded\n" );
960             }
961         }
962     }
963
964     ok( LockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "LockFile failed\n" );
965     ok( !LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 succeeded\n" );
966     ok( !LockFile( handle, 0, 0x20000000, 20, 0 ), "LockFile 0x20000000,20 succeeded\n" );
967     ok( UnlockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "UnlockFile failed\n" );
968
969     /* wrap-around lock should not do anything */
970     /* (but still succeeds on NT4 so we don't check result) */
971     LockFile( handle, 0, 0x10000000, 0, 0xf0000001 );
972
973     limited_LockFile = 0;
974     if (!LockFile( handle, ~0, ~0, 1, 0 ))
975     {
976         limited_LockFile = 1;
977     }
978
979     limited_UnLockFile || ok( UnlockFile( handle, ~0, ~0, 1, 0 ), "Unlockfile ~0,1 failed\n" );
980
981     /* zero-byte lock */
982     ok( LockFile( handle, 100, 0, 0, 0 ), "LockFile 100,0 failed\n" );
983     limited_LockFile || ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" );
984     ok( LockFile( handle, 90, 0, 10, 0 ), "LockFile 90,10 failed\n" );
985     limited_LockFile || ok( !LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" );
986
987     ok( UnlockFile( handle, 90, 0, 10, 0 ), "UnlockFile 90,10 failed\n" );
988     !ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed\n" );
989
990     ok( UnlockFile( handle, 100, 0, 0, 0 ), "UnlockFile 100,0 failed\n" );
991
992     CloseHandle( handle );
993     DeleteFileA( filename );
994 }
995
996 static inline int is_sharing_compatible( DWORD access1, DWORD sharing1, DWORD access2, DWORD sharing2 )
997 {
998     if (!access1 || !access2) return 1;
999     if ((access1 & GENERIC_READ) && !(sharing2 & FILE_SHARE_READ)) return 0;
1000     if ((access1 & GENERIC_WRITE) && !(sharing2 & FILE_SHARE_WRITE)) return 0;
1001     if ((access2 & GENERIC_READ) && !(sharing1 & FILE_SHARE_READ)) return 0;
1002     if ((access2 & GENERIC_WRITE) && !(sharing1 & FILE_SHARE_WRITE)) return 0;
1003     return 1;
1004 }
1005
1006 static void test_file_sharing(void)
1007 {
1008     static const DWORD access_modes[4] = { 0, GENERIC_READ, GENERIC_WRITE, GENERIC_READ|GENERIC_WRITE };
1009     static const DWORD sharing_modes[4] = { 0, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE };
1010     int a1, s1, a2, s2;
1011     int ret;
1012
1013     /* make sure the file exists */
1014     HANDLE h = CreateFileA( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 );
1015     CloseHandle( h );
1016
1017     for (a1 = 0; a1 < 4; a1++)
1018     {
1019         for (s1 = 0; s1 < 4; s1++)
1020         {
1021             HANDLE h = CreateFileA( filename, access_modes[a1], sharing_modes[s1],
1022                                     NULL, OPEN_EXISTING, 0, 0 );
1023             if (h == INVALID_HANDLE_VALUE)
1024             {
1025                 ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
1026                 return;
1027             }
1028             for (a2 = 0; a2 < 4; a2++)
1029             {
1030                 for (s2 = 0; s2 < 4; s2++)
1031                 {
1032                     HANDLE h2 = CreateFileA( filename, access_modes[a2], sharing_modes[s2],
1033                                           NULL, OPEN_EXISTING, 0, 0 );
1034                     if (is_sharing_compatible( access_modes[a1], sharing_modes[s1],
1035                                                access_modes[a2], sharing_modes[s2] ))
1036                     {
1037                         ret = GetLastError();
1038                         ok( ERROR_SHARING_VIOLATION == ret || 0 == ret,
1039                             "Windows 95 sets GetLastError() = ERROR_SHARING_VIOLATION and\n"
1040                             "  Windows XP GetLastError() = 0, but now it is %d.\n"
1041                             "  indexes = %d, %d, %d, %d\n"
1042                             "  modes   =\n  %lx/%lx/%lx/%lx\n",
1043                             ret,
1044                             a1, s1, a2, s2, 
1045                             access_modes[a1], sharing_modes[s1],
1046                             access_modes[a2], sharing_modes[s2]
1047                             );
1048                     }
1049                     else
1050                     {
1051                         ok( h2 == INVALID_HANDLE_VALUE,
1052                             "open succeeded for modes %lx/%lx/%lx/%lx\n",
1053                             access_modes[a1], sharing_modes[s1],
1054                             access_modes[a2], sharing_modes[s2] );
1055                         if (h2 == INVALID_HANDLE_VALUE)
1056                             ok( GetLastError() == ERROR_SHARING_VIOLATION,
1057                                 "wrong error code %ld\n", GetLastError() );
1058                     }
1059                     if (h2 != INVALID_HANDLE_VALUE) CloseHandle( h2 );
1060                 }
1061             }
1062             CloseHandle( h );
1063         }
1064     }
1065     DeleteFileA( filename );
1066 }
1067
1068 static void test_FindFirstFileA()
1069 {
1070     HANDLE handle;
1071     WIN32_FIND_DATAA search_results;
1072     int err;
1073
1074     handle = FindFirstFileA("C:\\",&search_results);
1075     err = GetLastError();
1076     ok ( handle == INVALID_HANDLE_VALUE , "FindFirstFile on Root directory should Fail\n");
1077     if (handle == INVALID_HANDLE_VALUE)
1078       ok ( err == ERROR_FILE_NOT_FOUND, "Bad Error number %d\n", err);
1079     handle = FindFirstFileA("C:\\*",&search_results);
1080     ok ( handle != INVALID_HANDLE_VALUE, "FindFirstFile on C:\\* should succeed\n" );
1081     ok ( FindClose(handle) == TRUE, "Failed to close handle\n");
1082 }
1083
1084 static void test_FindNextFileA()
1085 {
1086     HANDLE handle;
1087     WIN32_FIND_DATAA search_results;
1088     int err;
1089
1090     handle = FindFirstFileA("C:\\*",&search_results);
1091     ok ( handle != INVALID_HANDLE_VALUE, "FindFirstFile on C:\\* should succeed\n" );
1092     while (FindNextFile(handle, &search_results))
1093     {
1094         /* get to the end of the files */
1095     }
1096     ok ( FindClose(handle) == TRUE, "Failed to close handle\n");
1097     err = GetLastError();
1098     ok ( err == ERROR_NO_MORE_FILES, "GetLastError should return ERROR_NO_MORE_FILES\n");
1099 }
1100
1101 static int test_Mapfile_createtemp(HANDLE *handle)
1102 {
1103     SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL);
1104     DeleteFile(filename);
1105     *handle = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, 0,
1106                          CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
1107     if (*handle != INVALID_HANDLE_VALUE) {
1108
1109         return 1;
1110     }
1111
1112     return 0;
1113 }
1114
1115 static void test_MapFile()
1116 {
1117     HANDLE handle;
1118     HANDLE hmap;
1119
1120     ok(test_Mapfile_createtemp(&handle), "Couldn't create test file.\n");
1121
1122     hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0x1000, "named_file_map" );
1123     ok( hmap != NULL, "mapping should work, I named it!\n" );
1124
1125     ok( CloseHandle( hmap ), "can't close mapping handle\n");
1126
1127     /* We have to close file before we try new stuff with mapping again.
1128        Else we would always succeed on XP or block descriptors on 95. */
1129     hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0, NULL );
1130     ok( hmap != NULL, "We should still be able to map!\n" );
1131     ok( CloseHandle( hmap ), "can't close mapping handle\n");
1132     ok( CloseHandle( handle ), "can't close file handle\n");
1133     handle = NULL;
1134
1135     ok(test_Mapfile_createtemp(&handle), "Couldn't create test file.\n");
1136
1137     hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0, 0, NULL );
1138     ok( hmap == NULL, "Mapping should not work, no name provided.\n" );
1139
1140     ok( hmap == NULL, "mapped zero size file\n");
1141     ok( GetLastError() == ERROR_FILE_INVALID, "not ERROR_FILE_INVALID\n");
1142
1143     hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0x1000, 0, NULL );
1144     ok( hmap == NULL, "mapping should fail\n");
1145     /* GetLastError() varies between win9x and WinNT and also depends on the filesystem */
1146
1147     hmap = CreateFileMapping( handle, NULL, PAGE_READWRITE, 0x1000, 0x10000, NULL );
1148     ok( hmap == NULL, "mapping should fail\n");
1149     /* GetLastError() varies between win9x and WinNT and also depends on the filesystem */
1150
1151     /* On XP you can now map again, on Win 95 you can not. */
1152
1153     ok( CloseHandle( handle ), "can't close file handle\n");
1154     ok( DeleteFileA( filename ), "DeleteFile failed after map\n" );
1155 }
1156
1157 static void test_GetFileType(void)
1158 {
1159     DWORD type;
1160     HANDLE h = CreateFileA( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 );
1161     ok( h != INVALID_HANDLE_VALUE, "open %s failed\n", filename );
1162     type = GetFileType(h);
1163     ok( type == FILE_TYPE_DISK, "expected type disk got %ld\n", type );
1164     CloseHandle( h );
1165     h = CreateFileA( "nul", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0 );
1166     ok( h != INVALID_HANDLE_VALUE, "open nul failed\n" );
1167     type = GetFileType(h);
1168     ok( type == FILE_TYPE_CHAR, "expected type char for nul got %ld\n", type );
1169     CloseHandle( h );
1170     DeleteFileA( filename );
1171 }
1172
1173 START_TEST(file)
1174 {
1175     test__hread(  );
1176     test__hwrite(  );
1177     test__lclose(  );
1178     test__lcreat(  );
1179     test__llseek(  );
1180     test__llopen(  );
1181     test__lread(  );
1182     test__lwrite(  );
1183     test_GetTempFileNameA();
1184     test_CopyFileA();
1185     test_CopyFileW();
1186     test_CreateFileA();
1187     test_CreateFileW();
1188     test_DeleteFileA();
1189     test_DeleteFileW();
1190     test_MoveFileA();
1191     test_MoveFileW();
1192     test_FindFirstFileA();
1193     test_FindNextFileA();
1194     test_LockFile();
1195     test_file_sharing();
1196     test_offset_in_overlapped_structure();
1197     test_MapFile();
1198     test_GetFileType();
1199 }