diff --git a/reactos/lib/kernel32/file/rw.c b/reactos/lib/kernel32/file/rw.c index dae30dfe8b8..ca39ebc6317 100644 --- a/reactos/lib/kernel32/file/rw.c +++ b/reactos/lib/kernel32/file/rw.c @@ -20,6 +20,9 @@ /* FUNCTIONS ****************************************************************/ + + + WINBOOL STDCALL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, @@ -74,13 +77,13 @@ WINBOOL STDCALL WriteFile(HANDLE hFile, return(TRUE); } -WINBOOL STDCALL KERNEL32_ReadFile(HANDLE hFile, - LPVOID lpBuffer, - DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesRead, - LPOVERLAPPED lpOverLapped, - LPOVERLAPPED_COMPLETION_ROUTINE - lpCompletionRoutine) + + +WINBOOL STDCALL ReadFile(HANDLE hFile, + LPVOID lpBuffer, + DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesRead, + LPOVERLAPPED lpOverLapped) { HANDLE hEvent = NULL; LARGE_INTEGER Offset; @@ -106,7 +109,7 @@ WINBOOL STDCALL KERNEL32_ReadFile(HANDLE hFile, errCode = NtReadFile(hFile, hEvent, - (PIO_APC_ROUTINE)lpCompletionRoutine, + NULL, NULL, IoStatusBlock, lpBuffer, @@ -127,18 +130,61 @@ WINBOOL STDCALL KERNEL32_ReadFile(HANDLE hFile, return(TRUE); } -WINBOOL STDCALL ReadFile(HANDLE hFile, - LPVOID lpBuffer, - DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesRead, - LPOVERLAPPED lpOverLapped) +VOID ApcRoutine(PVOID ApcContext, struct _IO_STATUS_BLOCK* IoStatusBlock, ULONG NumberOfBytesTransfered) { - return(KERNEL32_ReadFile(hFile, - lpBuffer, - nNumberOfBytesToRead, - lpNumberOfBytesRead, - lpOverLapped, - NULL)); + DWORD dwErrorCode; + LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine = (LPOVERLAPPED_COMPLETION_ROUTINE)ApcContext; + + dwErrorCode = RtlNtStatusToDosError( IoStatusBlock->Status); + lpCompletionRoutine( dwErrorCode, NumberOfBytesTransfered, (LPOVERLAPPED)IoStatusBlock ); +} + + +WINBOOL WriteFileEx( + HANDLE hFile, + LPCVOID lpBuffer, + DWORD nNumberOfBytesToWrite, + LPOVERLAPPED lpOverLapped, + LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine + ) +{ + + LARGE_INTEGER Offset; + NTSTATUS errCode; + PIO_STATUS_BLOCK IoStatusBlock; + PLARGE_INTEGER ptrOffset; + + DPRINT("WriteFileEx(hFile %x)\n",hFile); + + if (lpOverLapped == NULL) + return FALSE; + + Offset.u.LowPart = lpOverLapped->Offset; + Offset.u.HighPart = lpOverLapped->OffsetHigh; + lpOverLapped->Internal = STATUS_PENDING; + IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped; + ptrOffset = &Offset; + + + + errCode = NtWriteFile(hFile, + NULL, + ApcRoutine, + lpCompletionRoutine, + IoStatusBlock, + (PVOID)lpBuffer, + nNumberOfBytesToWrite, + ptrOffset, + NULL); + if (!NT_SUCCESS(errCode)) + { + SetLastError(RtlNtStatusToDosError(errCode)); + DPRINT("WriteFileEx() failed\n"); + return FALSE; + } + + DPRINT("WriteFileEx() succeeded\n"); + return(TRUE); } WINBOOL STDCALL ReadFileEx(HANDLE hFile, @@ -147,10 +193,36 @@ WINBOOL STDCALL ReadFileEx(HANDLE hFile, LPOVERLAPPED lpOverLapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) { - return(KERNEL32_ReadFile(hFile, - lpBuffer, - nNumberOfBytesToRead, - NULL, - lpOverLapped, - lpCompletionRoutine)); + LARGE_INTEGER Offset; + NTSTATUS errCode; + PIO_STATUS_BLOCK IoStatusBlock; + PLARGE_INTEGER ptrOffset; + + if (lpOverLapped == NULL) + return FALSE; + + Offset.u.LowPart = lpOverLapped->Offset; + Offset.u.HighPart = lpOverLapped->OffsetHigh; + lpOverLapped->Internal = STATUS_PENDING; + IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped; + ptrOffset = &Offset; + + + errCode = NtReadFile(hFile, + NULL, + ApcRoutine, + lpCompletionRoutine, + IoStatusBlock, + lpBuffer, + nNumberOfBytesToRead, + ptrOffset, + NULL); + + + if (!NT_SUCCESS(errCode)) + { + SetLastError(RtlNtStatusToDosError(errCode)); + return(FALSE); + } + return(TRUE); } diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index 9d6391d0a8e..d98025119cc 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.25 1999/09/27 20:58:44 ariadne Exp $ +# $Id: makefile,v 1.26 1999/10/02 20:20:42 ariadne Exp $ # # ReactOS Operating System # @@ -32,7 +32,7 @@ FILE_OBJECTS = file/file.o file/curdir.o file/lfile.o file/dir.o \ file/create.o file/find.o file/copy.o file/pipe.o \ file/move.o file/lock.o file/rw.o file/delete.o -MEM_OBJECTS = mem/virtual.o mem/heap.o mem/utils.o mem/section.o +MEM_OBJECTS = mem/virtual.o mem/heap.o mem/utils.o mem/section.o mem/isbad.o NLS_OBJECTS = nls/codepage.o nls/cpmisc.o nls/cptable.o\ nls/cp37.o nls/cp437.o nls/cp500.o nls/cp737.o nls/cp775.o nls/cp850.o nls/cp852.o nls/cp855.o nls/cp857.o\ diff --git a/reactos/lib/kernel32/mem/isbad.c b/reactos/lib/kernel32/mem/isbad.c new file mode 100644 index 00000000000..a2e4e2df4a0 --- /dev/null +++ b/reactos/lib/kernel32/mem/isbad.c @@ -0,0 +1,111 @@ +#include + +WINBOOL +STDCALL +IsBadReadPtr( CONST VOID *lp, UINT ucb ) +{ + MEMORY_BASIC_INFORMATION MemoryInformation; + + if ( ucb == 0 ) + return FALSE; + + VirtualQuery( lp, &MemoryInformation, sizeof(MEMORY_BASIC_INFORMATION) ); + + if ( MemoryInformation.State != MEM_COMMIT ) + return FALSE; + + if ( MemoryInformation.RegionSize < ucb ) + return FALSE; + + if ( MemoryInformation.Protect == PAGE_EXECUTE ) + return FALSE; + + if ( MemoryInformation.Protect == PAGE_NOACCESS ) + return FALSE; + + return TRUE; + +} +WINBOOL +STDCALL +IsBadHugeReadPtr( CONST VOID *lp, UINT ucb ) +{ + return IsBadReadPtr(lp,ucb); +} + +WINBOOL +STDCALL +IsBadCodePtr( FARPROC lpfn ) +{ + MEMORY_BASIC_INFORMATION MemoryInformation; + + + VirtualQuery( lpfn, &MemoryInformation, sizeof(MEMORY_BASIC_INFORMATION) ); + + if ( MemoryInformation.State != MEM_COMMIT ) + return FALSE; + + + if ( MemoryInformation.Protect == PAGE_EXECUTE || MemoryInformation.Protect == PAGE_EXECUTE_READ) + return TRUE; + + + return FALSE; +} + +WINBOOL +STDCALL IsBadWritePtr( LPVOID lp, UINT ucb ) +{ + MEMORY_BASIC_INFORMATION MemoryInformation; + + if ( ucb == 0 ) + return FALSE; + + VirtualQuery( lp, &MemoryInformation, sizeof(MEMORY_BASIC_INFORMATION) ); + + if ( MemoryInformation.State != MEM_COMMIT ) + return FALSE; + + + if ( MemoryInformation.RegionSize < ucb ) + return FALSE; + + + if ( MemoryInformation.Protect == PAGE_READONLY) + return FALSE; + + if ( MemoryInformation.Protect == PAGE_EXECUTE || MemoryInformation.Protect == PAGE_EXECUTE_READ) + return FALSE; + + if ( MemoryInformation.Protect == PAGE_NOACCESS ) + return FALSE; + + return TRUE; +} + +WINBOOL +STDCALL +IsBadHugeWritePtr( + LPVOID lp, + UINT ucb + ) +{ + return IsBadWritePtr(lp,ucb); +} + + +WINBOOL +STDCALL +IsBadStringPtrW( LPCWSTR lpsz, UINT ucchMax ) +{ + UINT Len = wcsnlen(lpsz+1,ucchMax>>1); + return IsBadReadPtr(lpsz,Len<<1); +} + +WINBOOL +STDCALL +IsBadStringPtrA( LPCSTR lpsz, UINT ucchMax ) +{ + UINT Len = strnlen(lpsz+1,ucchMax); + return IsBadReadPtr(lpsz,Len); +} diff --git a/reactos/lib/kernel32/mem/virtual.c b/reactos/lib/kernel32/mem/virtual.c index c90d8b67cf1..dc8d2c2836f 100644 --- a/reactos/lib/kernel32/mem/virtual.c +++ b/reactos/lib/kernel32/mem/virtual.c @@ -101,3 +101,80 @@ WINBOOL STDCALL VirtualProtectEx(HANDLE hProcess, } return(TRUE); } + + +WINBOOL +STDCALL +VirtualLock ( + LPVOID lpAddress, + DWORD dwSize + ) +{ + ULONG BytesLocked; + NTSTATUS Status; + Status = NtLockVirtualMemory(NtCurrentProcess(),lpAddress,dwSize, &BytesLocked); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + return TRUE; +} + + +DWORD +STDCALL +VirtualQuery ( + LPCVOID lpAddress, + PMEMORY_BASIC_INFORMATION lpBuffer, + DWORD dwLength + ) +{ + return VirtualQueryEx (NtCurrentProcess(),lpAddress, lpBuffer, dwLength ); +} + +#define MemoryBasicInformation 0 +DWORD +STDCALL +VirtualQueryEx ( + HANDLE hProcess, + LPCVOID lpAddress, + PMEMORY_BASIC_INFORMATION lpBuffer, + DWORD dwLength + ) +{ + NTSTATUS Status; + ULONG ResultLength; + + Status = NtQueryVirtualMemory( + hProcess,(LPVOID)lpAddress, + MemoryBasicInformation, lpBuffer, + sizeof(MEMORY_BASIC_INFORMATION), + &ResultLength ); + + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return ResultLength; + } + return ResultLength; +} + + +WINBOOL +STDCALL +VirtualUnlock ( + LPVOID lpAddress, + DWORD dwSize + ) +{ + ULONG BytesLocked; + NTSTATUS Status; + Status = NtUnlockVirtualMemory(NtCurrentProcess(),lpAddress,dwSize, &BytesLocked); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + return TRUE; +} diff --git a/reactos/lib/kernel32/misc/env.c b/reactos/lib/kernel32/misc/env.c index abaac3f0f2c..60a1addd42e 100644 --- a/reactos/lib/kernel32/misc/env.c +++ b/reactos/lib/kernel32/misc/env.c @@ -346,3 +346,153 @@ FreeEnvironmentStringsW( return TRUE; } + +int ExpandVariableA( + LPCSTR lpSrc, LPSTR lpDst, DWORD nSize , DWORD *nWritten) +{ + int nVar = 0; + LPSTR lpVar; + LPSTR lpEnd; + + if ( nWritten == NULL ) + return -1; + + if ( *lpSrc != '%' ) { + return -1; + } + + + lpVar = (LPSTR)lpSrc; + lpVar++; + + + lpEnd = strchr( lpVar, '%' ); + if ( lpEnd == NULL ) { + return -1; + } + else + *lpEnd = 0; + + nWritten = GetEnvironmentVariableA(lpVar,lpDst,nSize); + *lpEnd = '%'; + + if ( nWritten == 0 ) + return -1; + + if ( nWritten > nSize ) + return -1; + + return (lpEnd - lpVar) -1; +} + + +DWORD STDCALL ExpandEnvironmentStringsA( + LPCSTR lpSrc, LPSTR lpDst, DWORD nSize +) +{ + DWORD v; + DWORD bw; + + while(*lpSrc != 0 && nSize > 0 ) + { + if ( *lpSrc == '%' ) { + v = ExpandVariableA(lpSrc,lpDst,nSize , &bw); + if ( v == -1 ) { + *lpDst = *lpSrc; + lpDst++; + lpSrc++; + nSize--; + } + else { + lpSrc+=v; + lpDst+=bw; + nSize-=bw; + } + } + else { + + *lpDst = *lpSrc; + lpDst++; + lpSrc++; + nSize--; + + } + + } + +} + +int ExpandVariableW( + LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize , DWORD *nWritten) +{ + LPWSTR lpVar; + LPWSTR lpEnd; + + if ( nWritten == NULL ) + return -1; + + if ( *lpSrc != L'%' ) { + return -1; + } + + + lpVar = (LPWSTR)lpSrc; + lpVar++; + + + lpEnd = wcschr( lpVar, L'%' ); + if ( lpEnd == NULL ) { + return -1; + } + else + *lpEnd = 0; + + nWritten = GetEnvironmentVariableW(lpVar,lpDst,nSize); + *lpEnd = L'%'; + + if ( nWritten == 0 ) + return -1; + + if ( nWritten > nSize ) + return -1; + + return ((lpEnd - lpVar)/2) -1; +} + + +DWORD STDCALL ExpandEnvironmentStringsW( + LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize +) +{ + DWORD v; + DWORD bw; + + while(*lpSrc != 0 && nSize > 0 ) + { + if ( *lpSrc == L'%' ) { + v = ExpandVariableW(lpSrc,lpDst,nSize , &bw); + if ( v == -1 ) { + *lpDst = *lpSrc; + lpDst++; + lpSrc++; + nSize--; + } + else { + lpSrc+=v; + lpDst+=bw; + nSize-=bw; + } + } + else { + + *lpDst = *lpSrc; + lpDst++; + lpSrc++; + nSize--; + + } + + } + +} + diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 291ae780059..b9c9f0e97f7 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.4 1999/09/27 20:58:44 ariadne Exp $ +/* $Id: stubs.c,v 1.5 1999/10/02 20:20:44 ariadne Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -815,30 +815,6 @@ ExitVDM ( } -DWORD -STDCALL -ExpandEnvironmentStringsW ( - LPCWSTR lpSrc, - LPWSTR lpDst, - DWORD nSize - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -DWORD -STDCALL -ExpandEnvironmentStringsA ( - LPCSTR lpSrc, - LPSTR lpDst, - DWORD nSize - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} DWORD @@ -2751,87 +2727,6 @@ InvalidateConsoleDIBits ( } -WINBOOL -STDCALL -IsBadCodePtr ( - FARPROC lpfn - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -WINBOOL -STDCALL -IsBadHugeReadPtr ( - CONST VOID * lp, - UINT ucb - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -WINBOOL -STDCALL -IsBadHugeWritePtr ( - LPVOID lp, - UINT ucb - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -WINBOOL -STDCALL -IsBadReadPtr ( - CONST VOID * lp, - UINT ucb - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -WINBOOL -STDCALL -IsBadStringPtrA ( - LPCSTR lpsz, - UINT ucchMax - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -WINBOOL -STDCALL -IsBadStringPtrW ( - LPCWSTR lpsz, - UINT ucchMax - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - - -WINBOOL -STDCALL -IsBadWritePtr ( - LPVOID lp, - UINT ucb - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} WINBOOL @@ -3893,16 +3788,6 @@ SizeofResource ( } -WINBOOL -STDCALL -TerminateThread ( - HANDLE hThread, - DWORD dwExitCode - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} LPVOID @@ -4063,56 +3948,8 @@ VirtualBufferExceptionHandler ( } -WINBOOL -STDCALL -VirtualLock ( - LPVOID lpAddress, - DWORD dwSize - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} -DWORD -STDCALL -VirtualQuery ( - LPCVOID lpAddress, - PMEMORY_BASIC_INFORMATION lpBuffer, - DWORD dwLength - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -DWORD -STDCALL -VirtualQueryEx ( - HANDLE hProcess, - LPCVOID lpAddress, - PMEMORY_BASIC_INFORMATION lpBuffer, - DWORD dwLength - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - - -WINBOOL -STDCALL -VirtualUnlock ( - LPVOID lpAddress, - DWORD dwSize - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - WINBOOL STDCALL @@ -4209,19 +4046,7 @@ WriteConsoleInputVDMW ( } -WINBOOL -STDCALL -WriteFileEx ( - HANDLE hFile, - LPCVOID lpBuffer, - DWORD nNumberOfBytesToWrite, - LPOVERLAPPED lpOverlapped, - LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} + WINBOOL diff --git a/reactos/lib/kernel32/thread/thread.c b/reactos/lib/kernel32/thread/thread.c index 579391d10e2..89f883aad8f 100644 --- a/reactos/lib/kernel32/thread/thread.c +++ b/reactos/lib/kernel32/thread/thread.c @@ -269,6 +269,27 @@ DWORD STDCALL ResumeThread(HANDLE hThread) return PreviousResumeCount; } + +WINBOOL +STDCALL +TerminateThread ( + HANDLE hThread, + DWORD dwExitCode + ) +{ + NTSTATUS errCode; + + errCode = NtTerminateThread(hThread, + dwExitCode); + if (!NT_SUCCESS(errCode)) + { + SetLastError(RtlNtStatusToDosError(errCode)); + return FALSE; + } + return TRUE; +} + + DWORD STDCALL SuspendThread(HANDLE hThread) { NTSTATUS errCode;