diff --git a/dlls/kernel/tests/file.c b/dlls/kernel/tests/file.c
index ee4b10b..cfc98eb 100644
--- a/dlls/kernel/tests/file.c
+++ b/dlls/kernel/tests/file.c
@@ -55,35 +55,35 @@
     filehandle = _lcreat( filename, 0 );
     if (filehandle == HFILE_ERROR)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
 
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_READ );
 
-    ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)", filename, GetLastError(  ) );
+    ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)\n", filename, GetLastError(  ) );
 
     bytes_read = _hread( filehandle, buffer, 2 * strlen( sillytext ) );
 
-    ok( lstrlenA( sillytext ) == bytes_read, "file read size error" );
+    ok( lstrlenA( sillytext ) == bytes_read, "file read size error\n" );
 
     for (bytes_wanted = 0; bytes_wanted < lstrlenA( sillytext ); bytes_wanted++)
     {
-        ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );
-        ok( _hread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value" );
+        ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
+        ok( _hread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value\n" );
         for (i = 0; i < bytes_wanted; i++)
         {
-            ok( buffer[i] == sillytext[i], "that's not what's written" );
+            ok( buffer[i] == sillytext[i], "that's not what's written\n" );
         }
     }
 
-    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
 }
 
 
@@ -102,21 +102,21 @@
     filehandle = _lcreat( filename, 0 );
     if (filehandle == HFILE_ERROR)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
 
-    ok( HFILE_ERROR != _hwrite( filehandle, "", 0 ), "_hwrite complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, "", 0 ), "_hwrite complains\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_READ );
 
     bytes_read = _hread( filehandle, buffer, 1);
 
-    ok( 0 == bytes_read, "file read size error" );
+    ok( 0 == bytes_read, "file read size error\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_READWRITE );
 
@@ -130,18 +130,18 @@
             buffer[i] = rand(  );
             checksum[0] = checksum[0] + buffer[i];
         }
-        ok( HFILE_ERROR != _hwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains" );
+        ok( HFILE_ERROR != _hwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains\n" );
         bytes_written = bytes_written + sizeof( buffer );
     }
 
-    ok( HFILE_ERROR != _hwrite( filehandle, checksum, 1 ), "_hwrite complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, checksum, 1 ), "_hwrite complains\n" );
     bytes_written++;
 
-    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
 
     memory_object = LocalAlloc( LPTR, bytes_written );
 
-    ok( 0 != memory_object, "LocalAlloc fails. (Could be out of memory.)" );
+    ok( 0 != memory_object, "LocalAlloc fails. (Could be out of memory.)\n" );
 
     contents = LocalLock( memory_object );
 
@@ -149,9 +149,9 @@
 
     contents = LocalLock( memory_object );
 
-    ok( NULL != contents, "LocalLock whines" );
+    ok( NULL != contents, "LocalLock whines\n" );
 
-    ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length" );
+    ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length\n" );
 
     checksum[0] = '\0';
     i = 0;
@@ -162,11 +162,11 @@
     }
     while (i < bytes_written - 1);
 
-    ok( checksum[0] == contents[i], "stored checksum differ from computed checksum" );
+    ok( checksum[0] == contents[i], "stored checksum differ from computed checksum\n" );
 
-    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
 }
 
 
@@ -177,15 +177,15 @@
     filehandle = _lcreat( filename, 0 );
     if (filehandle == HFILE_ERROR)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
 
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
 }
 
 
@@ -201,107 +201,107 @@
     filehandle = _lcreat( filename, 0 );
     if (filehandle == HFILE_ERROR)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
 
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
 
-    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );
+    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
 
-    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value" );
+    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
-    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file" );
+    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file\n" );
 
-    ok( DeleteFileA(filename) != 0, "DeleteFile failed (%ld)", GetLastError());
+    ok( DeleteFileA(filename) != 0, "DeleteFile failed (%ld)\n", GetLastError());
 
     filehandle = _lcreat( filename, 1 ); /* readonly */
-    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)", filename, GetLastError(  ) );
+    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError(  ) );
 
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write never the less" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write never the less\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
-    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file" );
+    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should be able to find file\n" );
 
-    ok( 0 == DeleteFileA( filename ), "shouldn't be able to delete a readonly file" );
+    ok( 0 == DeleteFileA( filename ), "shouldn't be able to delete a readonly file\n" );
 
-    ok( SetFileAttributesA(filename, FILE_ATTRIBUTE_NORMAL ) != 0, "couldn't change attributes on file" );
+    ok( SetFileAttributesA(filename, FILE_ATTRIBUTE_NORMAL ) != 0, "couldn't change attributes on file\n" );
 
-    ok( DeleteFileA( filename ) != 0, "now it should be possible to delete the file!" );
+    ok( DeleteFileA( filename ) != 0, "now it should be possible to delete the file!\n" );
 
     filehandle = _lcreat( filename, 2 );
-    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)", filename, GetLastError(  ) );
+    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError(  ) );
 
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
 
-    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );
+    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
 
-    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value" );
+    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
-    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file" );
+    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
 
     filehandle = _lcreat( filename, 4 ); /* SYSTEM file */
-    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)", filename, GetLastError(  ) );
+    ok( HFILE_ERROR != filehandle, "couldn't create file \"%s\" (err=%ld)\n", filename, GetLastError(  ) );
 
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
 
-    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );
+    ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
 
-    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value" );
+    ok( _hread( filehandle, buffer, strlen( sillytext ) ) ==  lstrlenA( sillytext ), "erratic _hread return value\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
-    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file" );
+    ok( INVALID_HANDLE_VALUE != FindFirstFileA( filename, &search_results ), "should STILL be able to find file\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
 
     filehandle=_lcreat (slashname, 0); /* illegal name */
     if (HFILE_ERROR==filehandle) {
       err=GetLastError ();
       ok (err==ERROR_INVALID_NAME || err==ERROR_PATH_NOT_FOUND,
-          "creating file \"%s\" failed with error %d", slashname, err);
+          "creating file \"%s\" failed with error %d\n", slashname, err);
     } else { /* only NT succeeds */
       _lclose(filehandle);
       find=FindFirstFileA (slashname, &search_results);
       if (INVALID_HANDLE_VALUE==find)
-        ok (0, "file \"%s\" not found", slashname);
+        ok (0, "file \"%s\" not found\n", slashname);
       else {
-        ok (0!=FindClose (find), "FindClose complains (%ld)", GetLastError ());
+        ok (0!=FindClose (find), "FindClose complains (%ld)\n", GetLastError ());
         slashname[strlen(slashname)-1]=0;
         ok (!strcmp (slashname, search_results.cFileName),
-            "found unexpected name \"%s\"", search_results.cFileName);
+            "found unexpected name \"%s\"\n", search_results.cFileName);
         ok (FILE_ATTRIBUTE_ARCHIVE==search_results.dwFileAttributes,
-            "attributes of file \"%s\" are 0x%04lx", search_results.cFileName,
+            "attributes of file \"%s\" are 0x%04lx\n", search_results.cFileName,
             search_results.dwFileAttributes);
       }
-      ok (0!=DeleteFileA (slashname), "Can't delete \"%s\" (%ld)", slashname,
+      ok (0!=DeleteFileA (slashname), "Can't delete \"%s\" (%ld)\n", slashname,
           GetLastError ());
     }
 
     filehandle=_lcreat (filename, 8); /* illegal attribute */
     if (HFILE_ERROR==filehandle)
-      ok (0, "couldn't create volume label \"%s\"", filename);
+      ok (0, "couldn't create volume label \"%s\"\n", filename);
     else {
       _lclose(filehandle);
       find=FindFirstFileA (filename, &search_results);
       if (INVALID_HANDLE_VALUE==find)
-        ok (0, "file \"%s\" not found", filename);
+        ok (0, "file \"%s\" not found\n", filename);
       else {
-        ok (0!=FindClose (find), "FindClose complains (%ld)", GetLastError ());
+        ok (0!=FindClose (find), "FindClose complains (%ld)\n", GetLastError ());
         ok (!strcmp (filename, search_results.cFileName),
-            "found unexpected name \"%s\"", search_results.cFileName);
+            "found unexpected name \"%s\"\n", search_results.cFileName);
         ok (FILE_ATTRIBUTE_ARCHIVE==search_results.dwFileAttributes,
-            "attributes of file \"%s\" are 0x%04lx", search_results.cFileName,
+            "attributes of file \"%s\" are 0x%04lx\n", search_results.cFileName,
             search_results.dwFileAttributes);
       }
-      ok (0!=DeleteFileA (filename), "Can't delete \"%s\" (%ld)", slashname,
+      ok (0!=DeleteFileA (filename), "Can't delete \"%s\" (%ld)\n", slashname,
           GetLastError ());
     }
 }
@@ -317,29 +317,29 @@
     filehandle = _lcreat( filename, 0 );
     if (filehandle == HFILE_ERROR)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
 
     for (i = 0; i < 400; i++)
     {
-        ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );
+        ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
     }
-    ok( HFILE_ERROR != _llseek( filehandle, 400 * strlen( sillytext ), FILE_CURRENT ), "should be able to seek" );
-    ok( HFILE_ERROR != _llseek( filehandle, 27 + 35 * strlen( sillytext ), FILE_BEGIN ), "should be able to seek" );
+    ok( HFILE_ERROR != _llseek( filehandle, 400 * strlen( sillytext ), FILE_CURRENT ), "should be able to seek\n" );
+    ok( HFILE_ERROR != _llseek( filehandle, 27 + 35 * strlen( sillytext ), FILE_BEGIN ), "should be able to seek\n" );
 
     bytes_read = _hread( filehandle, buffer, 1);
-    ok( 1 == bytes_read, "file read size error" );
-    ok( buffer[0] == sillytext[27], "_llseek error, it got lost seeking" );
-    ok( HFILE_ERROR != _llseek( filehandle, -400 * strlen( sillytext ), FILE_END ), "should be able to seek" );
+    ok( 1 == bytes_read, "file read size error\n" );
+    ok( buffer[0] == sillytext[27], "_llseek error, it got lost seeking\n" );
+    ok( HFILE_ERROR != _llseek( filehandle, -400 * strlen( sillytext ), FILE_END ), "should be able to seek\n" );
 
     bytes_read = _hread( filehandle, buffer, 1);
-    ok( 1 == bytes_read, "file read size error" );
-    ok( buffer[0] == sillytext[0], "_llseek error, it got lost seeking" );
-    ok( HFILE_ERROR != _llseek( filehandle, 1000000, FILE_END ), "should be able to seek past file; poor, poor Windows programmers" );
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( 1 == bytes_read, "file read size error\n" );
+    ok( buffer[0] == sillytext[0], "_llseek error, it got lost seeking\n" );
+    ok( HFILE_ERROR != _llseek( filehandle, 1000000, FILE_END ), "should be able to seek past file; poor, poor Windows programmers\n" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
 }
 
 
@@ -352,31 +352,31 @@
     filehandle = _lcreat( filename, 0 );
     if (filehandle == HFILE_ERROR)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
 
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_READ );
-    ok( HFILE_ERROR == _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write!" );
+    ok( HFILE_ERROR == _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite shouldn't be able to write!\n" );
     bytes_read = _hread( filehandle, buffer, strlen( sillytext ) );
-    ok( strlen( sillytext )  == bytes_read, "file read size error" );
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( strlen( sillytext )  == bytes_read, "file read size error\n" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_READWRITE );
     bytes_read = _hread( filehandle, buffer, 2 * strlen( sillytext ) );
-    ok( strlen( sillytext )  == bytes_read, "file read size error" );
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine" );
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( strlen( sillytext )  == bytes_read, "file read size error\n" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine\n" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_WRITE );
-    ok( HFILE_ERROR == _hread( filehandle, buffer, 1 ), "you should only be able to write this file" );
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine" );
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR == _hread( filehandle, buffer, 1 ), "you should only be able to write this file\n" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite should write just fine\n" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
     /* TODO - add tests for the SHARE modes  -  use two processes to pull this one off */
 }
 
@@ -392,35 +392,35 @@
     filehandle = _lcreat( filename, 0 );
     if (filehandle == HFILE_ERROR)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
 
-    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains" );
+    ok( HFILE_ERROR != _hwrite( filehandle, sillytext, strlen( sillytext ) ), "_hwrite complains\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_READ );
 
-    ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)", filename, GetLastError());
+    ok( HFILE_ERROR != filehandle, "couldn't open file \"%s\" again (err=%ld)\n", filename, GetLastError());
 
     bytes_read = _lread( filehandle, buffer, 2 * strlen( sillytext ) );
 
-    ok( lstrlenA( sillytext ) == bytes_read, "file read size error" );
+    ok( lstrlenA( sillytext ) == bytes_read, "file read size error\n" );
 
     for (bytes_wanted = 0; bytes_wanted < strlen( sillytext ); bytes_wanted++)
     {
-        ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains" );
-        ok( _lread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value" );
+        ok( 0 == _llseek( filehandle, 0, FILE_BEGIN ), "_llseek complains\n" );
+        ok( _lread( filehandle, buffer, bytes_wanted ) == bytes_wanted, "erratic _hread return value\n" );
         for (i = 0; i < bytes_wanted; i++)
         {
-            ok( buffer[i] == sillytext[i], "that's not what's written" );
+            ok( buffer[i] == sillytext[i], "that's not what's written\n" );
         }
     }
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
 }
 
 
@@ -439,21 +439,21 @@
     filehandle = _lcreat( filename, 0 );
     if (filehandle == HFILE_ERROR)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
 
-    ok( HFILE_ERROR != _lwrite( filehandle, "", 0 ), "_hwrite complains" );
+    ok( HFILE_ERROR != _lwrite( filehandle, "", 0 ), "_hwrite complains\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_READ );
 
     bytes_read = _hread( filehandle, buffer, 1);
 
-    ok( 0 == bytes_read, "file read size error" );
+    ok( 0 == bytes_read, "file read size error\n" );
 
-    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose(filehandle), "_lclose complains\n" );
 
     filehandle = _lopen( filename, OF_READWRITE );
 
@@ -467,18 +467,18 @@
             buffer[i] = rand(  );
             checksum[0] = checksum[0] + buffer[i];
         }
-        ok( HFILE_ERROR != _lwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains" );
+        ok( HFILE_ERROR != _lwrite( filehandle, buffer, sizeof( buffer ) ), "_hwrite complains\n" );
         bytes_written = bytes_written + sizeof( buffer );
     }
 
-    ok( HFILE_ERROR != _lwrite( filehandle, checksum, 1 ), "_hwrite complains" );
+    ok( HFILE_ERROR != _lwrite( filehandle, checksum, 1 ), "_hwrite complains\n" );
     bytes_written++;
 
-    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
 
     memory_object = LocalAlloc( LPTR, bytes_written );
 
-    ok( 0 != memory_object, "LocalAlloc fails, could be out of memory" );
+    ok( 0 != memory_object, "LocalAlloc fails, could be out of memory\n" );
 
     contents = LocalLock( memory_object );
 
@@ -486,9 +486,9 @@
 
     contents = LocalLock( memory_object );
 
-    ok( NULL != contents, "LocalLock whines" );
+    ok( NULL != contents, "LocalLock whines\n" );
 
-    ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length" );
+    ok( bytes_written == _hread( filehandle, contents, bytes_written), "read length differ from write length\n" );
 
     checksum[0] = '\0';
     i = 0;
@@ -499,11 +499,11 @@
     }
     while (i < bytes_written - 1);
 
-    ok( checksum[0] == contents[i], "stored checksum differ from computed checksum" );
+    ok( checksum[0] == contents[i], "stored checksum differ from computed checksum\n" );
 
-    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains" );
+    ok( HFILE_ERROR != _lclose( filehandle ), "_lclose complains\n" );
 
-    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)", GetLastError(  ) );
+    ok( DeleteFileA( filename ) != 0, "DeleteFile failed (%ld)\n", GetLastError(  ) );
 }
 
 static void test_CopyFileA(void)
@@ -514,14 +514,14 @@
     DWORD ret;
 
     ret = GetTempPathA(MAX_PATH, temp_path);
-    ok(ret != 0, "GetTempPathA error %ld", GetLastError());
-    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH");
+    ok(ret != 0, "GetTempPathA error %ld\n", GetLastError());
+    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
 
     ret = GetTempFileNameA(temp_path, prefix, 0, source);
-    ok(ret != 0, "GetTempFileNameA error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
 
     ret = GetTempFileNameA(temp_path, prefix, 0, dest);
-    ok(ret != 0, "GetTempFileNameA error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
 
     ret = CopyFileA(source, dest, TRUE);
     ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
@@ -546,14 +546,14 @@
     ret = GetTempPathW(MAX_PATH, temp_path);
     if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
         return;
-    ok(ret != 0, "GetTempPathW error %ld", GetLastError());
-    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH");
+    ok(ret != 0, "GetTempPathW error %ld\n", GetLastError());
+    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
 
     ret = GetTempFileNameW(temp_path, prefix, 0, source);
-    ok(ret != 0, "GetTempFileNameW error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
 
     ret = GetTempFileNameW(temp_path, prefix, 0, dest);
-    ok(ret != 0, "GetTempFileNameW error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
 
     ret = CopyFileW(source, dest, TRUE);
     ok(!ret && GetLastError() == ERROR_FILE_EXISTS,
@@ -577,16 +577,16 @@
     DWORD ret;
 
     ret = GetTempPathA(MAX_PATH, temp_path);
-    ok(ret != 0, "GetTempPathA error %ld", GetLastError());
-    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH");
+    ok(ret != 0, "GetTempPathA error %ld\n", GetLastError());
+    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
 
     ret = GetTempFileNameA(temp_path, prefix, 0, filename);
-    ok(ret != 0, "GetTempFileNameA error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
 
     hFile = CreateFileA(filename, GENERIC_READ, 0, NULL,
                         CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
     ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS,
-        "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS");
+        "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n");
 
     ret = DeleteFileA(filename);
     ok(ret, "DeleteFileA: error %ld\n", GetLastError());
@@ -603,16 +603,16 @@
     ret = GetTempPathW(MAX_PATH, temp_path);
     if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
         return;
-    ok(ret != 0, "GetTempPathW error %ld", GetLastError());
-    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH");
+    ok(ret != 0, "GetTempPathW error %ld\n", GetLastError());
+    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
 
     ret = GetTempFileNameW(temp_path, prefix, 0, filename);
-    ok(ret != 0, "GetTempFileNameW error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
 
     hFile = CreateFileW(filename, GENERIC_READ, 0, NULL,
                         CREATE_NEW, FILE_FLAG_RANDOM_ACCESS, 0);
     ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS,
-        "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS");
+        "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n");
 
     ret = DeleteFileW(filename);
     ok(ret, "DeleteFileW: error %ld\n", GetLastError());
@@ -627,7 +627,7 @@
     /* this test may depend on the config file settings */
     result = GetTempFileNameA("C:", "abc", 1, out);
     ok( result != 0, "GetTempFileNameA: error %ld\n", GetLastError() );
-    ok( ((out[0] == 'C') && (out[1] == ':')) && (out[2] == '\\'), "GetTempFileNameA: first three characters should be C:\\, string was actually %s", out );
+    ok( ((out[0] == 'C') && (out[1] == ':')) && (out[2] == '\\'), "GetTempFileNameA: first three characters should be C:\\, string was actually %s\n", out );
 
     result = GetTempFileNameA("c:\\windows\\", "abc", 2, out);
     ok( result != 0, "GetTempFileNameA: error %ld\n", GetLastError() );
@@ -642,12 +642,12 @@
     ret = DeleteFileA(NULL);
     ok(!ret && (GetLastError() == ERROR_INVALID_PARAMETER ||
                 GetLastError() == ERROR_PATH_NOT_FOUND),
-       "DeleteFileA(NULL) returned ret=%d error=%ld",ret,GetLastError());
+       "DeleteFileA(NULL) returned ret=%d error=%ld\n",ret,GetLastError());
 
     ret = DeleteFileA("");
     ok(!ret && (GetLastError() == ERROR_PATH_NOT_FOUND ||
                 GetLastError() == ERROR_BAD_PATHNAME),
-       "DeleteFileA(\"\") returned ret=%d error=%ld",ret,GetLastError());
+       "DeleteFileA(\"\") returned ret=%d error=%ld\n",ret,GetLastError());
 }
 
 static void test_DeleteFileW( void )
@@ -659,11 +659,11 @@
     if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
         return;
     ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND,
-       "DeleteFileW(NULL) returned ret=%d error=%ld",ret,GetLastError());
+       "DeleteFileW(NULL) returned ret=%d error=%ld\n",ret,GetLastError());
 
     ret = DeleteFileW(emptyW);
     ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND,
-       "DeleteFileW(\"\") returned ret=%d error=%ld",ret,GetLastError());
+       "DeleteFileW(\"\") returned ret=%d error=%ld\n",ret,GetLastError());
 }
 
 #define IsDotDir(x)     ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0))))
@@ -676,14 +676,14 @@
     DWORD ret;
 
     ret = GetTempPathA(MAX_PATH, tempdir);
-    ok(ret != 0, "GetTempPathA error %ld", GetLastError());
-    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH");
+    ok(ret != 0, "GetTempPathA error %ld\n", GetLastError());
+    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
 
     ret = GetTempFileNameA(tempdir, prefix, 0, source);
-    ok(ret != 0, "GetTempFileNameA error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
 
     ret = GetTempFileNameA(tempdir, prefix, 0, dest);
-    ok(ret != 0, "GetTempFileNameA error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameA error %ld\n", GetLastError());
 
     ret = MoveFileA(source, dest);
     ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS,
@@ -697,14 +697,14 @@
 
     lstrcatA(tempdir, "Remove Me");
     ret = CreateDirectoryA(tempdir, NULL);
-    ok(ret == TRUE, "CreateDirectoryA failed");
+    ok(ret == TRUE, "CreateDirectoryA failed\n");
 
     lstrcpyA(source, dest);
     lstrcpyA(dest, tempdir);
     lstrcatA(dest, "\\wild?.*");
     ret = MoveFileA(source, dest);
     todo_wine {
-      ok(!ret, "MoveFileA: shouldn't move to wildcard file");
+      ok(!ret, "MoveFileA: shouldn't move to wildcard file\n");
       ok(GetLastError() == ERROR_INVALID_NAME,
               "MoveFileA: with wildcards, unexpected error %ld\n", GetLastError());
 #if 0
@@ -725,7 +725,7 @@
             lpName = fd.cAlternateFileName;
             if (!lpName[0])
               lpName = fd.cFileName;
-            ok(IsDotDir(lpName), "MoveFileA: wildcards file created!");
+            ok(IsDotDir(lpName), "MoveFileA: wildcards file created!\n");
           }
           while (FindNextFileA(hFind, &fd));
           FindClose(hFind);
@@ -752,14 +752,14 @@
     ret = GetTempPathW(MAX_PATH, temp_path);
     if (ret==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
         return;
-    ok(ret != 0, "GetTempPathW error %ld", GetLastError());
-    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH");
+    ok(ret != 0, "GetTempPathW error %ld\n", GetLastError());
+    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
 
     ret = GetTempFileNameW(temp_path, prefix, 0, source);
-    ok(ret != 0, "GetTempFileNameW error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
 
     ret = GetTempFileNameW(temp_path, prefix, 0, dest);
-    ok(ret != 0, "GetTempFileNameW error %ld", GetLastError());
+    ok(ret != 0, "GetTempFileNameW error %ld\n", GetLastError());
 
     ret = MoveFileW(source, dest);
     ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS,
@@ -783,17 +783,17 @@
     UINT i;
     char temp_path[MAX_PATH], temp_fname[MAX_PATH];
 
-    ok(GetTempPathA(MAX_PATH, temp_path) != 0, "GetTempPathA error %ld", GetLastError());
-    ok(GetTempFileNameA(temp_path, "pfx", 0, temp_fname) != 0, "GetTempFileNameA error %ld", GetLastError());
+    ok(GetTempPathA(MAX_PATH, temp_path) != 0, "GetTempPathA error %ld\n", GetLastError());
+    ok(GetTempFileNameA(temp_path, "pfx", 0, temp_fname) != 0, "GetTempFileNameA error %ld\n", GetLastError());
 
     /*** Write File *****************************************************/
 
     hFile = CreateFileA(temp_fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
-    ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA error %ld", GetLastError());
+    ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA error %ld\n", GetLastError());
 
     for(i = 0; i < sizeof(buf); i++) buf[i] = i;
-    ok(WriteFile(hFile, buf, sizeof(buf), &done, NULL), "WriteFile error %ld", GetLastError());
-    ok(done == sizeof(buf), "expected number of bytes written %lu", done);
+    ok(WriteFile(hFile, buf, sizeof(buf), &done, NULL), "WriteFile error %ld\n", GetLastError());
+    ok(done == sizeof(buf), "expected number of bytes written %lu\n", done);
 
     memset(&ov, 0, sizeof(ov));
     ov.Offset = PATTERN_OFFSET;
@@ -801,19 +801,19 @@
     rc=WriteFile(hFile, pattern, sizeof(pattern), &done, &ov);
     /* Win 9x does not support the overlapped I/O on files */
     if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) {
-        ok(rc, "WriteFile error %ld", GetLastError());
-        ok(done == sizeof(pattern), "expected number of bytes written %lu", done);
+        ok(rc, "WriteFile error %ld\n", GetLastError());
+        ok(done == sizeof(pattern), "expected number of bytes written %lu\n", done);
         trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));
         ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)),
-           "expected file offset %d", PATTERN_OFFSET + sizeof(pattern));
+           "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern));
 
         ov.Offset = sizeof(buf) * 2;
         ov.OffsetHigh = 0;
-        ok(WriteFile(hFile, pattern, sizeof(pattern), &done, &ov), "WriteFile error %ld", GetLastError());
-        ok(done == sizeof(pattern), "expected number of bytes written %lu", done);
+        ok(WriteFile(hFile, pattern, sizeof(pattern), &done, &ov), "WriteFile error %ld\n", GetLastError());
+        ok(done == sizeof(pattern), "expected number of bytes written %lu\n", done);
         /*trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));*/
         ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (sizeof(buf) * 2 + sizeof(pattern)),
-           "expected file offset %d", sizeof(buf) * 2 + sizeof(pattern));
+           "expected file offset %d\n", sizeof(buf) * 2 + sizeof(pattern));
     }
 
     CloseHandle(hFile);
@@ -821,7 +821,7 @@
     /*** Read File *****************************************************/
 
     hFile = CreateFileA(temp_fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
-    ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA error %ld", GetLastError());
+    ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA error %ld\n", GetLastError());
 
     memset(buf, 0, sizeof(buf));
     memset(&ov, 0, sizeof(ov));
@@ -830,12 +830,12 @@
     rc=ReadFile(hFile, buf, sizeof(pattern), &done, &ov);
     /* Win 9x does not support the overlapped I/O on files */
     if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) {
-        ok(rc, "ReadFile error %ld", GetLastError());
-        ok(done == sizeof(pattern), "expected number of bytes read %lu", done);
+        ok(rc, "ReadFile error %ld\n", GetLastError());
+        ok(done == sizeof(pattern), "expected number of bytes read %lu\n", done);
         trace("Current offset = %04lx\n", SetFilePointer(hFile, 0, NULL, FILE_CURRENT));
         ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)),
-           "expected file offset %d", PATTERN_OFFSET + sizeof(pattern));
-        ok(!memcmp(buf, pattern, sizeof(pattern)), "pattern match failed");
+           "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern));
+        ok(!memcmp(buf, pattern, sizeof(pattern)), "pattern match failed\n");
     }
 
     CloseHandle(hFile);
@@ -854,62 +854,62 @@
                           CREATE_ALWAYS, 0, 0 );
     if (handle == INVALID_HANDLE_VALUE)
     {
-        ok(0,"couldn't create file \"%s\" (err=%ld)",filename,GetLastError());
+        ok(0,"couldn't create file \"%s\" (err=%ld)\n",filename,GetLastError());
         return;
     }
-    ok( WriteFile( handle, sillytext, strlen(sillytext), &written, NULL ), "write failed" );
+    ok( WriteFile( handle, sillytext, strlen(sillytext), &written, NULL ), "write failed\n" );
 
-    ok( LockFile( handle, 0, 0, 0, 0 ), "LockFile failed" );
-    ok( UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile failed" );
-    ok( !UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile succeeded" );
+    ok( LockFile( handle, 0, 0, 0, 0 ), "LockFile failed\n" );
+    ok( UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile failed\n" );
+    ok( !UnlockFile( handle, 0, 0, 0, 0 ), "UnlockFile succeeded\n" );
 
-    ok( LockFile( handle, 10, 0, 20, 0 ), "LockFile 10,20 failed" );
+    ok( LockFile( handle, 10, 0, 20, 0 ), "LockFile 10,20 failed\n" );
     /* overlapping locks must fail */
-    ok( !LockFile( handle, 12, 0, 10, 0 ), "LockFile 12,10 succeeded" );
-    ok( !LockFile( handle, 5, 0, 6, 0 ), "LockFile 5,6 succeeded" );
+    ok( !LockFile( handle, 12, 0, 10, 0 ), "LockFile 12,10 succeeded\n" );
+    ok( !LockFile( handle, 5, 0, 6, 0 ), "LockFile 5,6 succeeded\n" );
     /* non-overlapping locks must succeed */
-    ok( LockFile( handle, 5, 0, 5, 0 ), "LockFile 5,5 failed" );
+    ok( LockFile( handle, 5, 0, 5, 0 ), "LockFile 5,5 failed\n" );
 
-    ok( !UnlockFile( handle, 10, 0, 10, 0 ), "UnlockFile 10,10 succeeded" );
-    ok( UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 failed" );
-    ok( !UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 again succeeded" );
-    ok( UnlockFile( handle, 5, 0, 5, 0 ), "UnlockFile 5,5 failed" );
+    ok( !UnlockFile( handle, 10, 0, 10, 0 ), "UnlockFile 10,10 succeeded\n" );
+    ok( UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 failed\n" );
+    ok( !UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 again succeeded\n" );
+    ok( UnlockFile( handle, 5, 0, 5, 0 ), "UnlockFile 5,5 failed\n" );
 
     overlapped.Offset = 100;
     overlapped.OffsetHigh = 0;
     overlapped.hEvent = 0;
-    ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 100,100 failed" );
+    ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 100,100 failed\n" );
     /* overlapping shared locks are OK */
     overlapped.Offset = 150;
-    ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed" );
+    ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed\n" );
     /* but exclusive is not */
     ok( !LockFileEx( handle, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, 0, 50, 0, &overlapped ),
-        "LockFileEx exclusive 150,50 succeeded" );
-    ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 failed" );
-    ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 again succeeded" );
+        "LockFileEx exclusive 150,50 succeeded\n" );
+    ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 failed\n" );
+    ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 again succeeded\n" );
     overlapped.Offset = 100;
-    ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 failed" );
-    ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 again succeeded" );
+    ok( UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 failed\n" );
+    ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 100,100 again succeeded\n" );
 
-    ok( LockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "LockFile failed" );
-    ok( !LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 succeeded" );
-    ok( !LockFile( handle, 0, 0x20000000, 20, 0 ), "LockFile 0x20000000,20 succeeded" );
-    ok( UnlockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "UnlockFile failed" );
+    ok( LockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "LockFile failed\n" );
+    ok( !LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 succeeded\n" );
+    ok( !LockFile( handle, 0, 0x20000000, 20, 0 ), "LockFile 0x20000000,20 succeeded\n" );
+    ok( UnlockFile( handle, 0, 0x10000000, 0, 0xf0000000 ), "UnlockFile failed\n" );
 
     /* wrap-around lock should not do anything */
     /* (but still succeeds on NT4 so we don't check result) */
     LockFile( handle, 0, 0x10000000, 0, 0xf0000001 );
-    ok( LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 failed" );
-    ok( UnlockFile( handle, ~0, ~0, 1, 0 ), "Unlockfile ~0,1 failed" );
+    ok( LockFile( handle, ~0, ~0, 1, 0 ), "LockFile ~0,1 failed\n" );
+    ok( UnlockFile( handle, ~0, ~0, 1, 0 ), "Unlockfile ~0,1 failed\n" );
 
     /* zero-byte lock */
-    ok( LockFile( handle, 100, 0, 0, 0 ), "LockFile 100,0 failed" );
-    ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded" );
-    ok( LockFile( handle, 90, 0, 10, 0 ), "LockFile 90,10 failed" );
-    ok( LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed" );
-    ok( UnlockFile( handle, 90, 0, 10, 0 ), "UnlockFile 90,10 failed" );
-    ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed" );
-    ok( UnlockFile( handle, 100, 0, 0, 0 ), "UnlockFile 100,0 failed" );
+    ok( LockFile( handle, 100, 0, 0, 0 ), "LockFile 100,0 failed\n" );
+    ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" );
+    ok( LockFile( handle, 90, 0, 10, 0 ), "LockFile 90,10 failed\n" );
+    ok( LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" );
+    ok( UnlockFile( handle, 90, 0, 10, 0 ), "UnlockFile 90,10 failed\n" );
+    ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed\n" );
+    ok( UnlockFile( handle, 100, 0, 0, 0 ), "UnlockFile 100,0 failed\n" );
 
     CloseHandle( handle );
     DeleteFileA( filename );
@@ -923,12 +923,12 @@
 
     handle = FindFirstFileA("C:\\",&search_results);
     err = GetLastError();
-    ok ( handle == INVALID_HANDLE_VALUE , "FindFirstFile on Root directory should Fail");
+    ok ( handle == INVALID_HANDLE_VALUE , "FindFirstFile on Root directory should Fail\n");
     if (handle == INVALID_HANDLE_VALUE)
       ok ( err == ERROR_FILE_NOT_FOUND, "Bad Error number %d\n", err);
     handle = FindFirstFileA("C:\\*",&search_results);
-    ok ( handle != INVALID_HANDLE_VALUE, "FindFirstFile on C:\\* should succeed" );
-    ok ( FindClose(handle) == TRUE, "Failed to close handle");
+    ok ( handle != INVALID_HANDLE_VALUE, "FindFirstFile on C:\\* should succeed\n" );
+    ok ( FindClose(handle) == TRUE, "Failed to close handle\n");
 }
 
 static void test_FindNextFileA()
@@ -938,14 +938,14 @@
     int err;
 
     handle = FindFirstFileA("C:\\*",&search_results);
-    ok ( handle != INVALID_HANDLE_VALUE, "FindFirstFile on C:\\* should succeed" );
+    ok ( handle != INVALID_HANDLE_VALUE, "FindFirstFile on C:\\* should succeed\n" );
     while (FindNextFile(handle, &search_results))
     {
         /* get to the end of the files */
     }
-    ok ( FindClose(handle) == TRUE, "Failed to close handle");
+    ok ( FindClose(handle) == TRUE, "Failed to close handle\n");
     err = GetLastError();
-    ok ( err == ERROR_NO_MORE_FILES, "GetLastError should return ERROR_NO_MORE_FILES");
+    ok ( err == ERROR_NO_MORE_FILES, "GetLastError should return ERROR_NO_MORE_FILES\n");
 }
 
 static void test_MapFile()
@@ -976,7 +976,7 @@
 
     ok( CloseHandle( hmap ), "can't close mapping handle\n");
     ok( CloseHandle( handle ), "can't close file handle\n");
-    ok( DeleteFileA( filename ), "DeleteFile failed after map" );
+    ok( DeleteFileA( filename ), "DeleteFile failed after map\n" );
 }
 
 START_TEST(file)
