From 70f7c7269c05c2c5114b73c1aecbb08b06783386 Mon Sep 17 00:00:00 2001 From: David Welch Date: Sun, 7 Feb 1999 00:37:29 +0000 Subject: [PATCH] Fixed bugs in lib/kernel32/file/curdir.c and lib/kernel32/misc/console.c svn path=/trunk/; revision=217 --- reactos/apps/utils/shell/shell.c | 25 ++- reactos/lib/kernel32/file/create.c | 91 +---------- reactos/lib/kernel32/file/curdir.c | 243 ++++++++++++++-------------- reactos/lib/kernel32/file/file.c | 42 +++-- reactos/lib/kernel32/mem/heap.c | 18 +-- reactos/lib/kernel32/misc/console.c | 93 ++++------- reactos/lib/kernel32/process/proc.c | 4 +- reactos/lib/ntdll/makefile | 2 +- reactos/lib/ntdll/stubs/stubs.c | 1 - reactos/ntoskrnl/hal/x86/exp.c | 8 + reactos/ntoskrnl/io/create.c | 1 + reactos/ntoskrnl/io/rw.c | 1 + reactos/readme_rex | 77 +++------ 13 files changed, 236 insertions(+), 370 deletions(-) diff --git a/reactos/apps/utils/shell/shell.c b/reactos/apps/utils/shell/shell.c index 91ef78953cd..a69e80b9780 100644 --- a/reactos/apps/utils/shell/shell.c +++ b/reactos/apps/utils/shell/shell.c @@ -171,6 +171,7 @@ void ReadLine(char* line) KEY_EVENT_RECORD KeyEvent; DWORD Result; UCHAR CurrentDir[255]; + char ch; GetCurrentDirectoryA(255,CurrentDir); debug_printf(CurrentDir); @@ -178,26 +179,18 @@ void ReadLine(char* line) do { if (!ReadConsoleA(InputHandle, - &KeyEvent, - sizeof(KEY_EVENT_RECORD), - &Result, - NULL)) + &ch, + 1, + &Result, + NULL)) { debug_printf("Failed to read from console\n"); for(;;); } - if (KeyEvent.bKeyDown && KeyEvent.AsciiChar != 0) - { - debug_printf("%c", KeyEvent.AsciiChar); - *line = KeyEvent.AsciiChar; - line++; - } - } while (!(KeyEvent.bKeyDown && KeyEvent.AsciiChar == '\n')); - ReadFile(InputHandle, - &KeyEvent, - sizeof(KEY_EVENT_RECORD), - &Result, - NULL); + debug_printf("%c", ch); + *line = ch; + line++; + } while (ch != '\n'); line--; *line = 0; } diff --git a/reactos/lib/kernel32/file/create.c b/reactos/lib/kernel32/file/create.c index 368c18ef10b..892a6bd3951 100644 --- a/reactos/lib/kernel32/file/create.c +++ b/reactos/lib/kernel32/file/create.c @@ -10,11 +10,6 @@ * Removed use of SearchPath (not used by Windows) */ -/* - * NOTES: Please don't alter without debugging - * - */ - /* INCLUDES *****************************************************************/ #include @@ -24,7 +19,7 @@ #include #include -#define NDEBUG +//#define NDEBUG #include /* FUNCTIONS ****************************************************************/ @@ -130,8 +125,7 @@ HANDLE STDCALL CreateFileW(LPCWSTR lpFileName, FileNameW[3] = '\\'; FileNameW[4] = 0; wcscat(FileNameW,PathNameW); - - + FileNameString.Length = wcslen( FileNameW)*sizeof(WCHAR); if ( FileNameString.Length == 0 ) @@ -163,8 +157,6 @@ HANDLE STDCALL CreateFileW(LPCWSTR lpFileName, Flags, NULL, 0); - - DPRINT("After create file\n"); if (!NT_SUCCESS(Status)) { SetLastError(RtlNtStatusToDosError(Status)); @@ -173,82 +165,3 @@ HANDLE STDCALL CreateFileW(LPCWSTR lpFileName, return(FileHandle); } -#if 0 -HANDLE STDCALL CreateFileW(LPCWSTR lpFileName, - DWORD dwDesiredAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, - DWORD dwFlagsAndAttributes, - HANDLE hTemplateFile) -{ - HANDLE FileHandle; - NTSTATUS Status; - - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - UNICODE_STRING FileNameString; - ULONG Flags = 0; - WCHAR PathNameW[MAX_PATH]; - WCHAR *FilePart; - UINT Len = 0; - WCHAR CurrentDir[MAX_PATH]; - - OutputDebugStringA("CreateFileW\n"); - - if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED)) - { - Flags |= FILE_SYNCHRONOUS_IO_ALERT; - } - -// lstrcpyW(PathNameW,L"\\??\\"); - PathNameW[0] = '\\'; - PathNameW[1] = '?'; - PathNameW[2] = '?'; - PathNameW[3] = '\\'; - PathNameW[4] = 0; - - dprintf("Name %w\n",PathNameW); - if (lpFileName[0] != L'\\' && lpFileName[1] != L':') - { - Len = GetCurrentDirectoryW(MAX_PATH,CurrentDir); - dprintf("CurrentDir %w\n",CurrentDir); - lstrcatW(PathNameW,CurrentDir); - dprintf("Name %w\n",PathNameW); - } - lstrcatW(PathNameW,lpFileName); - dprintf("Name %w\n",PathNameW); - - FileNameString.Length = lstrlenW( PathNameW)*sizeof(WCHAR); - - if ( FileNameString.Length == 0 ) - return NULL; - - if ( FileNameString.Length > MAX_PATH ) - return NULL; - - FileNameString.Buffer = (WCHAR *)PathNameW; - FileNameString.MaximumLength = FileNameString.Length+sizeof(WCHAR); - - ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); - ObjectAttributes.RootDirectory = NULL; - ObjectAttributes.ObjectName = &FileNameString; - ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE; - ObjectAttributes.SecurityDescriptor = NULL; - ObjectAttributes.SecurityQualityOfService = NULL; - - Status = NtCreateFile(&FileHandle, - dwDesiredAccess, - &ObjectAttributes, - &IoStatusBlock, - NULL, - dwFlagsAndAttributes, - dwShareMode, - dwCreationDisposition, - Flags, - NULL, - 0); - return(FileHandle); -} - -#endif diff --git a/reactos/lib/kernel32/file/curdir.c b/reactos/lib/kernel32/file/curdir.c index cd13df6ae27..478fd401cbe 100644 --- a/reactos/lib/kernel32/file/curdir.c +++ b/reactos/lib/kernel32/file/curdir.c @@ -11,55 +11,46 @@ /* INCLUDES ******************************************************************/ #include -#include +//#define NDEBUG +#include /* GLOBALS *******************************************************************/ #define MAX_DOS_DRIVES 26 -WCHAR CurrentDirectoryW[MAX_PATH] = {0,}; -HANDLE hCurrentDirectory = NULL; -int drive= 2; +static HANDLE hCurrentDirectory = NULL; +static ULONG CurrentDrive = 0; -char DriveDirectoryW[MAX_DOS_DRIVES][MAX_PATH] = { {"A:\\"},{"B:\\"},{"C:\\"},{"D:\\"}, - {"E:\\"},{"F:\\"},{"G:\\"},{"H:\\"}, - {"I:\\"},{"J:\\"},{"K:\\"},{"L:\\"}, - {"M:\\"},{"N:\\"},{"O:\\"},{"P:\\"}, - {"Q:\\"},{"R:\\"},{"S:\\"},{"T:\\"}, - {"U:\\"},{"V:\\"},{"W:\\"},{"X:\\"}, - {"Y:\\"},{"Z:\\"} }; +static WCHAR DriveDirectoryW[MAX_DOS_DRIVES][MAX_PATH] = {{0}}; -WCHAR SystemDirectoryW[MAX_PATH]; +static WCHAR SystemDirectoryW[MAX_PATH]; +static WCHAR WindowsDirectoryW[MAX_PATH]; -WCHAR WindowsDirectoryW[MAX_PATH]; - - -WINBOOL -STDCALL -SetCurrentDirectoryW( - LPCWSTR lpPathName - ); +WINBOOL STDCALL SetCurrentDirectoryW(LPCWSTR lpPathName); /* FUNCTIONS *****************************************************************/ DWORD STDCALL GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer) { UINT uSize,i; + WCHAR TempDir[MAX_PATH]; + if ( lpBuffer == NULL ) return 0; - - uSize = lstrlenW(CurrentDirectoryW); - if ( nBufferLength > uSize ) { + GetCurrentDirectoryW(MAX_PATH, TempDir); + uSize = lstrlenW(TempDir); + if (nBufferLength > uSize) + { i = 0; - while ((CurrentDirectoryW[i])!=0 && i < MAX_PATH) + while (TempDir[i] != 0) { - lpBuffer[i] = (unsigned char)CurrentDirectoryW[i]; - i++; + lpBuffer[i] = (unsigned char)TempDir[i]; + i++; } lpBuffer[i] = 0; - } + } return uSize; } @@ -67,16 +58,18 @@ DWORD STDCALL GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer) { UINT uSize; - DPRINT("CurrentDirectoryW %w\n",CurrentDirectoryW); + DPRINT("GetCurrentDirectoryW()\n"); if ( lpBuffer == NULL ) return 0; - uSize = lstrlenW(CurrentDirectoryW); - if ( nBufferLength > uSize ) - lstrcpynW(lpBuffer,CurrentDirectoryW,uSize); - + uSize = lstrlenW(DriveDirectoryW[CurrentDrive]) + 2; + if (nBufferLength > uSize) + { + lpBuffer[0] = 'A' + CurrentDrive; + lpBuffer[1] = ':'; + lstrcpyW(&lpBuffer[2], DriveDirectoryW[CurrentDrive]); + } DPRINT("GetCurrentDirectoryW() = %w\n",lpBuffer); - return uSize; } @@ -85,11 +78,10 @@ WINBOOL STDCALL SetCurrentDirectoryA(LPCSTR lpPathName) UINT i; WCHAR PathNameW[MAX_PATH]; - if ( lpPathName == NULL ) - return FALSE; - if ( strlen(lpPathName) > MAX_PATH ) - return FALSE; + return FALSE; + if ( lstrlen(lpPathName) > MAX_PATH ) + return FALSE; i = 0; while ((lpPathName[i])!=0 && i < MAX_PATH) { @@ -101,89 +93,106 @@ WINBOOL STDCALL SetCurrentDirectoryA(LPCSTR lpPathName) return SetCurrentDirectoryW(PathNameW); } - -WINBOOL -STDCALL -SetCurrentDirectoryW( - LPCWSTR lpPathName - ) +WINBOOL STDCALL SetCurrentDirectoryW(LPCWSTR lpPathName) { - int len; - int i,j; - HANDLE hDirOld = hCurrentDirectory; + ULONG len; WCHAR PathName[MAX_PATH]; - - if ( lpPathName == NULL ) - return FALSE; - len = lstrlenW(lpPathName); - if ( len > MAX_PATH ) - return FALSE; - - if ( len == 2 && isalpha(lpPathName[0]) && lpPathName[1] == ':' ) { - len = lstrlenW(CurrentDirectoryW); - for(i=0;i 0 && PathName[len-1] == L'\\' ) { - PathName[len-1] = 0; - } - len = lstrlenW(PathName); - for(i=3;i=2 && PathName[j] != '\\';j-- ) {} - PathName[j+1] = 0; - if ( i+4 < len ) { - PathName[i+3] = 0; - lstrcatW(PathName,&PathName[i+4]); - } - len = lstrlenW(PathName); - } - } - - hCurrentDirectory = CreateFileW(PathName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS|FILE_ATTRIBUTE_DIRECTORY,NULL); - if ( hCurrentDirectory == - 1 ) { - hCurrentDirectory = hDirOld; - DPRINT("%d\n",GetLastError()); - return FALSE; - } - else - CloseHandle(hDirOld); - + HANDLE hDir; + PWSTR prev, current; - lstrcpyW(CurrentDirectoryW,PathName); - lstrcatW(CurrentDirectoryW,L"\\"); - + DPRINT("SetCurrentDirectoryW(lpPathName %w\n",lpPathName); + + if (lpPathName == NULL) + return FALSE; + + len = lstrlenW(lpPathName); + if (len > MAX_PATH) + return FALSE; + + hDir = CreateFileW(lpPathName, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_DIRECTORY, + NULL); + if (hDir == NULL) + { + DPRINT("Failed to open directory\n"); + return(FALSE); + } + if (hCurrentDirectory != NULL) + { + CloseHandle(hCurrentDirectory); + } + hCurrentDirectory = hDir; + + if (isalpha(lpPathName[0]) && lpPathName[1] == ':' ) + { + DPRINT("lpPathName %w\n",lpPathName); + + CurrentDrive = toupper((UCHAR)lpPathName[0]) - 'A'; + if (!(lpPathName[2] == '\\' && lpPathName[3] == 0 && + DriveDirectoryW[CurrentDrive][0] != 0)) + { + wcscpy(DriveDirectoryW[CurrentDrive],&lpPathName[2]); + len = lstrlenW(DriveDirectoryW[CurrentDrive]); + if (DriveDirectoryW[CurrentDrive][len-1] != '\\') + { + DriveDirectoryW[CurrentDrive][len] = '\\'; + DriveDirectoryW[CurrentDrive][len+1] = 0; + } + } + return(TRUE); + } + if (lpPathName[0] == '\\') + { + wcscpy(DriveDirectoryW[CurrentDrive],lpPathName); + return(TRUE); + } + + GetCurrentDirectoryW(MAX_PATH, PathName); + lstrcatW(PathName, lpPathName); + len = lstrlenW(PathName); + if (PathName[len-1] != '\\') + { + PathName[len] = '\\'; + PathName[len+1] = 0; + } + + DPRINT("PathName %w\n",PathName); + + prev = NULL; + current = &PathName[2]; + + while (current != NULL) + { + if (current[1] == '.' && current[2] == '\\') + { + wcscpy(current, current+2); + } + else if (current[1] == '.' && current[2] == '.' && + current[3] == '\\' && prev != NULL) + { + wcscpy(prev, current+3); + current = prev; + while (prev > PathName && (*prev) != '\\') + { + prev--; + } + if (prev == PathName) + { + prev = NULL; + } + } + else + { + prev = current; + current = wcschr(current+1, (WCHAR)'\\'); + } + } + + lstrcpyW(DriveDirectoryW[CurrentDrive], &PathName[2]); return TRUE; } diff --git a/reactos/lib/kernel32/file/file.c b/reactos/lib/kernel32/file/file.c index 1c002775aac..ed8c172b539 100644 --- a/reactos/lib/kernel32/file/file.c +++ b/reactos/lib/kernel32/file/file.c @@ -4,7 +4,7 @@ * FILE: lib/kernel32/file/file.c * PURPOSE: Directory functions * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) - GetTempFileName is modified from WINE [ Alexandre Juiliard ] + * GetTempFileName is modified from WINE [ Alexandre Juiliard ] * UPDATE HISTORY: * Created 01/11/98 */ @@ -19,6 +19,9 @@ #include #include +#define NDEBUG +#include + #define LPPROGRESS_ROUTINE void* @@ -80,11 +83,11 @@ AreFileApisANSI(VOID) -WINBOOL STDCALL WriteFile(HANDLE hFile, - LPCVOID lpBuffer, - DWORD nNumberOfBytesToWrite, - LPDWORD lpNumberOfBytesWritten, - LPOVERLAPPED lpOverLapped) +WINBOOL STDCALL WriteFile(HANDLE hFile, + LPCVOID lpBuffer, + DWORD nNumberOfBytesToWrite, + LPDWORD lpNumberOfBytesWritten, + LPOVERLAPPED lpOverLapped) { LARGE_INTEGER Offset; @@ -92,9 +95,9 @@ WINBOOL STDCALL WriteFile(HANDLE hFile, NTSTATUS errCode; PIO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IIosb; - - - + + DPRINT("WriteFile(hFile %x\n",WriteFile); + if (lpOverLapped != NULL ) { SET_LARGE_INTEGER_LOW_PART(Offset, lpOverLapped->Offset); @@ -108,7 +111,10 @@ WINBOOL STDCALL WriteFile(HANDLE hFile, IoStatusBlock = &IIosb; Offset = NULL; } - errCode = NtWriteFile(hFile,hEvent,NULL,NULL, + errCode = NtWriteFile(hFile, + hEvent, + NULL, + NULL, IoStatusBlock, (PVOID)lpBuffer, nNumberOfBytesToWrite, @@ -119,8 +125,10 @@ WINBOOL STDCALL WriteFile(HANDLE hFile, SetLastError(RtlNtStatusToDosError(errCode)); return FALSE; } - if ( !lpNumberOfBytesWritten ) - *lpNumberOfBytesWritten = IoStatusBlock->Information; + if (lpNumberOfBytesWritten != NULL ) + { + *lpNumberOfBytesWritten = IoStatusBlock->Information; + } return(TRUE); } @@ -137,9 +145,8 @@ WINBOOL STDCALL ReadFile(HANDLE hFile, NTSTATUS errCode; PIO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IIosb; - - if ( lpOverLapped != NULL ) + if (lpOverLapped != NULL) { SET_LARGE_INTEGER_LOW_PART(ByteOffset, lpOverLapped->Offset); SET_LARGE_INTEGER_HIGH_PART(ByteOffset, lpOverLapped->OffsetHigh); @@ -162,15 +169,18 @@ WINBOOL STDCALL ReadFile(HANDLE hFile, lpBuffer, nNumberOfBytesToRead, Offset, - NULL); + NULL); + if ( !NT_SUCCESS(errCode) ) { SetLastError(RtlNtStatusToDosError(errCode)); return FALSE; } - if ( !lpNumberOfBytesRead ) + if (lpNumberOfBytesRead != NULL ) + { *lpNumberOfBytesRead = IoStatusBlock->Information; + } return TRUE; } diff --git a/reactos/lib/kernel32/mem/heap.c b/reactos/lib/kernel32/mem/heap.c index 7c0c6ed1292..7ef099143a7 100644 --- a/reactos/lib/kernel32/mem/heap.c +++ b/reactos/lib/kernel32/mem/heap.c @@ -985,13 +985,13 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem) pnextfrag=(PHEAP_FRAGMENT)((LPVOID)pfrag+add); if(pfrag->Magic!=HEAP_FRAG_MAGIC) { - dprintf("HeapValidate: fragment %d magic invalid, region 0x%lX," + DPRINT("HeapValidate: fragment %d magic invalid, region 0x%lX," " previous region 0x%lX\n", i, (ULONG)pcheck, (ULONG)pprev); return FALSE; } if(pfrag->Number!=i) { - dprintf("HeapValidate: fragment %d number invalid, region 0x%lX," + DPRINT("HeapValidate: fragment %d number invalid, region 0x%lX," " previous region 0x%lX\n", i, (ULONG)pcheck, (ULONG)pprev); return FALSE; } @@ -999,7 +999,7 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem) number++; if(pfrag->Sub!=psub) { - dprintf("HeapValidate: fragment %d suballoc invalid, region 0x%lX," + DPRINT("HeapValidate: fragment %d suballoc invalid, region 0x%lX," " previous region 0x%lX\n", i, (ULONG)pcheck, (ULONG)pprev); return FALSE; } @@ -1008,11 +1008,11 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem) } if(number!=psub->NumberFree) { - dprintf("HeapValidate: invalid number of free fragments, region 0x%lX," + DPRINT("HeapValidate: invalid number of free fragments, region 0x%lX," " previous region 0x%lX\n", (ULONG)pcheck, (ULONG)pprev); return FALSE; } - dprintf("HeapValidate: [0x%08lX-0x%08lX] suballocated," + DPRINT("HeapValidate: [0x%08lX-0x%08lX] suballocated," " bucket size=%d, bitmap=0x%08lX\n", (ULONG) pcheck, (ULONG) pnext, pbucket->Size, psub->Bitmap); } @@ -1020,22 +1020,22 @@ BOOL WINAPI HeapValidate(HANDLE hheap, DWORD flags, LPCVOID pmem) { if(HEAP_RSIZE(pcheck)!=HEAP_SIZE(pcheck)) { - dprintf("HeapValidate: invalid size of free region 0x%lX," + DPRINT("HeapValidate: invalid size of free region 0x%lX," " previous region 0x%lX\n", (ULONG) pcheck, (ULONG) pprev); return FALSE; } - dprintf("HeapValidate: [0x%08lX-0x%08lX] free\n", + DPRINT("HeapValidate: [0x%08lX-0x%08lX] free\n", (ULONG) pcheck, (ULONG) pnext ); } else if(HEAP_ISNORMAL(pcheck)) { - dprintf("HeapValidate: [0x%08lX-0x%08lX] allocated\n", + DPRINT("HeapValidate: [0x%08lX-0x%08lX] allocated\n", (ULONG) pcheck, (ULONG) pnext ); } else { - dprintf("HeapValidate: invalid tag %x, region 0x%lX," + DPRINT("HeapValidate: invalid tag %x, region 0x%lX," " previous region 0x%lX\n", pcheck->Size>>28, (ULONG)pcheck, (ULONG)pprev); return FALSE; diff --git a/reactos/lib/kernel32/misc/console.c b/reactos/lib/kernel32/misc/console.c index cb65ec0d964..5fc8953ace3 100644 --- a/reactos/lib/kernel32/misc/console.c +++ b/reactos/lib/kernel32/misc/console.c @@ -47,67 +47,36 @@ WriteConsoleA( } -WINBOOL -STDCALL -ReadConsoleA( - HANDLE hConsoleInput, - LPVOID lpBuffer, - DWORD nNumberOfCharsToRead, - LPDWORD lpNumberOfCharsRead, - LPVOID lpReserved - ) +WINBOOL STDCALL ReadConsoleA(HANDLE hConsoleInput, + LPVOID lpBuffer, + DWORD nNumberOfCharsToRead, + LPDWORD lpNumberOfCharsRead, + LPVOID lpReserved) { - KEY_EVENT_RECORD *k; - OVERLAPPED Overlapped; - OVERLAPPED * lpOverlapped; - int kSize; - int i,j; - - if ( lpReserved == NULL ) { - Overlapped.Internal = 0; - Overlapped.InternalHigh = 0; - Overlapped.Offset = 0; - Overlapped.OffsetHigh = 0; - // Overlapped.hEvent = CreateEvent(NULL,FALSE,TRUE,NULL); - lpOverlapped = &Overlapped; - } - else - lpOverlapped = lpReserved; - - - kSize = nNumberOfCharsToRead*sizeof(kSize); - k = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,kSize); - if ( k == NULL || kSize == 0 ) - return FALSE; - - k[0].AsciiChar = 0; - while(k[0].AsciiChar == 0 ) - { - ReadFile(hConsoleInput,k,kSize,lpNumberOfCharsRead,lpOverlapped); - - } - j = 0; - i = 0; - //if ( k[i].bKeyDown ) - { - ((char *)lpBuffer)[j] = k[i].AsciiChar; - j++; - } - i++; - while(j < nNumberOfCharsToRead && i < *lpNumberOfCharsRead ) { - //if ( k[i].bKeyDown ) - { - ((char *)lpBuffer)[j] = k[i].AsciiChar; - j++; - } - i++; - } - - HeapFree(GetProcessHeap(),0,k); - //if ( lpReserved == NULL ) { - // CloseHandle(Overlapped.hEvent); - //} - + KEY_EVENT_RECORD KeyEventRecord; + int i,j; + BOOL stat; + PCHAR Buffer = (PCHAR)lpBuffer; + DWORD Result; + + for (i=0; (stat && i