diff --git a/reactos/boot.bat b/reactos/boot.bat index 82893e32eb2..8be33a7cf03 100644 --- a/reactos/boot.bat +++ b/reactos/boot.bat @@ -1 +1 @@ -loaders\dos\loadros ntoskrnl\kimage.bin services\dd\ide\ide.o services\fs\vfat\vfatfsd.o services\dd\keyboard\keyboard.o %2 %3 %4 +loaders\dos\loadros ntoskrnl\kimage.bin services\dd\ide\ide.o services\fs\vfat\vfatfsd.o services\dd\keyboard\keyboard.o ext2fs.sys diff --git a/reactos/drivers/fs/ext2/dir.c b/reactos/drivers/fs/ext2/dir.c index b970fb1703d..7240ad04332 100644 --- a/reactos/drivers/fs/ext2/dir.c +++ b/reactos/drivers/fs/ext2/dir.c @@ -1,9 +1,9 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: services/fs/ext2/super.c + * FILE: services/fs/ext2/dir.c * PURPOSE: ext2 filesystem - * PROGRAMMER: David Welch (welch@mcmail.com) + * PROGRAMMER: David Welch (welch@cwcom.net) * UPDATE HISTORY: */ @@ -45,6 +45,9 @@ PVOID Ext2ProcessDirEntry(PDEVICE_EXTENSION DeviceExt, PWSTR FileName; struct ext2_inode inode; + DPRINT("FileIndex %d\n",FileIndex); + DPRINT("Buffer %x\n",Buffer); + Ext2ReadInode(DeviceExt, dir_entry->inode, &inode); @@ -95,7 +98,10 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt, struct ext2_dir_entry dir_entry; ULONG CurrentIndex; + DPRINT("Buffer %x\n",Buffer); + Buffer = Irp->UserBuffer; + DPRINT("IoStack->Flags %x\n",IoStack->Flags); if (IoStack->Flags & SL_RETURN_SINGLE_ENTRY) { @@ -106,6 +112,8 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt, UNIMPLEMENTED; } + DPRINT("Buffer->FileIndex %d\n", + ((PFILE_DIRECTORY_INFORMATION)Buffer)->FileIndex); if (IoStack->Flags & SL_INDEX_SPECIFIED) { StartIndex = ((PFILE_DIRECTORY_INFORMATION)Buffer)->FileIndex; @@ -120,9 +128,11 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt, StartIndex = 0; } + DPRINT("StartIndex %d\n",StartIndex); + for (i=0; iinode,"*",&dir_entry,&StartIndex)) + if (!Ext2ScanDir(DeviceExt,&Fcb->inode,"*",&dir_entry,&StartIndex)) { ((PFILE_DIRECTORY_INFORMATION)Buffer)->NextEntryOffset = 0; return(STATUS_NO_MORE_FILES); @@ -133,6 +143,7 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt, Buffer, StartIndex); } + return(STATUS_SUCCESS); } NTSTATUS Ext2DirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -253,10 +264,10 @@ NTSTATUS Ext2OpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, Fcb = ExAllocatePool(NonPagedPool, sizeof(EXT2_FCB)); unicode_to_ansi(name,FileName); - DbgPrint("name %s\n",name); + DPRINT("name %s\n",name); current_segment = strtok(name,"\\"); - do + while (current_segment!=NULL) { Ext2ReadInode(DeviceExt, current_inode, @@ -269,7 +280,7 @@ NTSTATUS Ext2OpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, } current_inode = entry.inode; current_segment = strtok(NULL,"\\"); - } while(current_segment!=NULL); + }; DPRINT("Found file\n"); Ext2ReadInode(DeviceExt, diff --git a/reactos/drivers/fs/ext2/inode.c b/reactos/drivers/fs/ext2/inode.c index a6c042ceba4..741085a357e 100644 --- a/reactos/drivers/fs/ext2/inode.c +++ b/reactos/drivers/fs/ext2/inode.c @@ -11,9 +11,11 @@ /* INCLUDES ****************************************************************/ #include -#include #include +#define NDEBUG +#include + #include "ext2fs.h" /* FUNCTIONS ***************************************************************/ diff --git a/reactos/drivers/fs/vfat/iface.c b/reactos/drivers/fs/vfat/iface.c index 7f2fd32a708..6e18b665bbf 100644 --- a/reactos/drivers/fs/vfat/iface.c +++ b/reactos/drivers/fs/vfat/iface.c @@ -48,9 +48,10 @@ ULONG Fat32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster) * disk read */ { - ULONG FATsector; - ULONG FATeis; - PULONG Block; + ULONG FATsector; + ULONG FATeis; + PULONG Block; + Block = ExAllocatePool(NonPagedPool,1024); FATsector=CurrentCluster/(512/sizeof(ULONG)); FATeis=CurrentCluster-(FATsector*(512/sizeof(ULONG))); @@ -69,11 +70,11 @@ ULONG Fat16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster) * in-memory FAT */ { - PUSHORT Block; + PUSHORT Block; Block=(PUSHORT)DeviceExt->FAT; CurrentCluster = Block[CurrentCluster]; if (CurrentCluster >= 0xfff8 && CurrentCluster <= 0xffff) - CurrentCluster = 0xffffffff; + CurrentCluster = 0xffffffff; DPRINT("Returning %x\n",CurrentCluster); return(CurrentCluster); } @@ -1096,11 +1097,11 @@ NTSTATUS FsdReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, VFATLoadCluster(DeviceExt,Buffer,CurrentCluster); CurrentCluster = GetNextCluster(DeviceExt, CurrentCluster); } - if (CurrentCluster == 0xffffffff) - { - ExFreePool(Temp); - return(STATUS_SUCCESS); - } + if (CurrentCluster == 0xffffffff) + { + ExFreePool(Temp); + return(STATUS_SUCCESS); + } (*LengthRead) = (*LengthRead) + DeviceExt->BytesPerCluster; Buffer = Buffer + DeviceExt->BytesPerCluster; @@ -1110,17 +1111,17 @@ NTSTATUS FsdReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, if (Length > 0) { (*LengthRead) = (*LengthRead) + Length; - if (FirstCluster==1) - { - VFATReadSectors(DeviceExt->StorageDevice,CurrentCluster - ,DeviceExt->Boot->SectorsPerCluster,Temp); - CurrentCluster += DeviceExt->Boot->SectorsPerCluster; - } - else - { - VFATLoadCluster(DeviceExt,Temp,CurrentCluster); - CurrentCluster = GetNextCluster(DeviceExt, CurrentCluster); - } + if (FirstCluster==1) + { + VFATReadSectors(DeviceExt->StorageDevice,CurrentCluster + ,DeviceExt->Boot->SectorsPerCluster,Temp); + CurrentCluster += DeviceExt->Boot->SectorsPerCluster; + } + else + { + VFATLoadCluster(DeviceExt,Temp,CurrentCluster); + CurrentCluster = GetNextCluster(DeviceExt, CurrentCluster); + } memcpy(Buffer, Temp, Length); } ExFreePool(Temp); diff --git a/reactos/include/ddk/iodef.h b/reactos/include/ddk/iodef.h index 22fb655aed0..431564c35dc 100644 --- a/reactos/include/ddk/iodef.h +++ b/reactos/include/ddk/iodef.h @@ -86,9 +86,22 @@ enum SL_ALLOW_RAW_MOUNT = 0x4000, }; +#define SL_FORCE_ACCESS_CHECK (0x1) +#define SL_OPEN_PAGING_FILE (0x2) +#define SL_OPEN_TARGET_DIRECTORY (0x4) +#define SL_CASE_SENSITIVE (0x8) +#define SL_KEY_SPECIFIED (0x10) +#define SL_OVERRIDE_VERIFY_VOLUME (0x20) +#define SL_WRITE_THROUGHT (0x40) +#define SL_FT_SEQUENTIAL_WRITE (0x80) +#define SL_FAIL_IMMEDIATELY (0x100) +#define SL_EXCLUSIVE_LOCK (0x200) +#define SL_WATCH_TREE (0x2000) + + #define SL_RESTART_SCAN (0x1) #define SL_RETURN_SINGLE_ENTRY (0x2) -#define SL_INDEX_SPECIFIED (0x3) +#define SL_INDEX_SPECIFIED (0x4) #define SL_PENDING_RETURNED 0x01 #define SL_INVOKE_ON_CANCEL 0x20 @@ -98,11 +111,8 @@ enum /* * Possible flags for the device object flags */ -enum -{ - DO_BUFFERED_IO = 0x1, - DO_DIRECT_IO = 0x2, -}; +#define DO_BUFFERED_IO (0x1) +#define DO_DIRECT_IO (0x2) /* * Possible device types diff --git a/reactos/include/ddk/zwtypes.h b/reactos/include/ddk/zwtypes.h index f778d1e322c..9a4b037a396 100644 --- a/reactos/include/ddk/zwtypes.h +++ b/reactos/include/ddk/zwtypes.h @@ -553,7 +553,6 @@ typedef struct _FILE_BOTH_DIRECTORY_INFORMATION { */ typedef struct _FILE_NOTIFY_INFORMATION { - ULONG NextEntryOffset; ULONG Action; ULONG FileNameLength; WCHAR FileName[0]; diff --git a/reactos/include/internal/pool.h b/reactos/include/internal/pool.h index d517b8b6efd..f1018cb2ad8 100644 --- a/reactos/include/internal/pool.h +++ b/reactos/include/internal/pool.h @@ -1,11 +1,12 @@ #ifndef __INTERNAL_POOL_H #define __INTERNAL_POOL_H -#include - #include +PVOID ExAllocateNonPagedPoolWithTag(ULONG type, + ULONG size, + ULONG Tag, + PVOID Caller); PVOID ExAllocatePagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag); -PVOID ExAllocateNonPagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag); #endif /* __INTERNAL_POOL_H */ diff --git a/reactos/lib/kernel32/file/create.c b/reactos/lib/kernel32/file/create.c index 89336620a1f..7a8954ddaf3 100644 --- a/reactos/lib/kernel32/file/create.c +++ b/reactos/lib/kernel32/file/create.c @@ -24,7 +24,7 @@ #include #include -//#define NDEBUG +#define NDEBUG #include /* FUNCTIONS ****************************************************************/ diff --git a/reactos/lib/kernel32/file/curdir.c b/reactos/lib/kernel32/file/curdir.c index a97a471901e..d12b1eb99ac 100644 --- a/reactos/lib/kernel32/file/curdir.c +++ b/reactos/lib/kernel32/file/curdir.c @@ -94,12 +94,7 @@ WINBOOL STDCALL SetCurrentDirectoryW(LPCWSTR lpPathName) return(TRUE); } -DWORD -STDCALL -GetTempPathA( - DWORD nBufferLength, - LPSTR lpBuffer - ) +DWORD STDCALL GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer) { WCHAR BufferW[MAX_PATH]; DWORD retCode; @@ -116,14 +111,8 @@ GetTempPathA( } -DWORD -STDCALL -GetTempPathW( - DWORD nBufferLength, - LPWSTR lpBuffer - ) +DWORD STDCALL GetTempPathW(DWORD nBufferLength, LPWSTR lpBuffer) { - WCHAR EnvironmentBufferW[MAX_PATH]; UINT i; @@ -137,12 +126,7 @@ GetTempPathW( return i; } -UINT -STDCALL -GetSystemDirectoryA( - LPSTR lpBuffer, - UINT uSize - ) +UINT STDCALL GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize) { UINT uPathSize,i; if ( lpBuffer == NULL ) @@ -161,12 +145,7 @@ GetSystemDirectoryA( return uPathSize; } -UINT -STDCALL -GetWindowsDirectoryA( - LPSTR lpBuffer, - UINT uSize - ) +UINT STDCALL GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { UINT uPathSize,i; if ( lpBuffer == NULL ) @@ -184,8 +163,7 @@ GetWindowsDirectoryA( return uPathSize; } -UINT STDCALL GetSystemDirectoryW(LPWSTR lpBuffer, - UINT uSize) +UINT STDCALL GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize) { UINT uPathSize; if ( lpBuffer == NULL ) @@ -198,8 +176,7 @@ UINT STDCALL GetSystemDirectoryW(LPWSTR lpBuffer, return uPathSize; } -UINT STDCALL GetWindowsDirectoryW(LPWSTR lpBuffer, - UINT uSize) +UINT STDCALL GetWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize) { UINT uPathSize; if ( lpBuffer == NULL ) diff --git a/reactos/lib/kernel32/file/dir.c b/reactos/lib/kernel32/file/dir.c index 98bfd152163..573cb531461 100644 --- a/reactos/lib/kernel32/file/dir.c +++ b/reactos/lib/kernel32/file/dir.c @@ -8,13 +8,19 @@ * Created 01/11/98 */ +/* + * NOTES: Changed to using ZwCreateFile + */ + /* INCLUDES ******************************************************************/ #include #include #include #include -#include + +#define NDEBUG +#include /* FUNCTIONS *****************************************************************/ @@ -48,70 +54,73 @@ WINBOOL STDCALL CreateDirectoryExA(LPCSTR lpTemplateDirectory, i++; } NewDirectoryW[i] = 0; - return CreateDirectoryExW(TemplateDirectoryW,NewDirectoryW,lpSecurityAttributes); + return CreateDirectoryExW(TemplateDirectoryW, + NewDirectoryW, + lpSecurityAttributes); } -WINBOOL -STDCALL -CreateDirectoryW( - LPCWSTR lpPathName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes - ) +WINBOOL STDCALL CreateDirectoryW(LPCWSTR lpPathName, + LPSECURITY_ATTRIBUTES lpSecurityAttributes) { - return CreateDirectoryExW(NULL,lpPathName,lpSecurityAttributes); + return CreateDirectoryExW(NULL,lpPathName,lpSecurityAttributes); } -WINBOOL -STDCALL -CreateDirectoryExW( - LPCWSTR lpTemplateDirectory, - LPCWSTR lpNewDirectory, - LPSECURITY_ATTRIBUTES lpSecurityAttributes - ) +WINBOOL STDCALL CreateDirectoryExW(LPCWSTR lpTemplateDirectory, + LPCWSTR lpNewDirectory, + LPSECURITY_ATTRIBUTES lpSecurityAttributes) { - NTSTATUS errCode; - HANDLE DirectoryHandle; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING DirectoryNameString; + NTSTATUS errCode; + HANDLE DirectoryHandle; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING DirectoryNameString; + IO_STATUS_BLOCK IoStatusBlock; + + if ( lpTemplateDirectory != NULL ) + { + // get object attributes from template directory + DPRINT("KERNEL32:FIXME:%s:%d\n",__FILE__,__LINE__); + return(FALSE); + } - if ( lpTemplateDirectory != NULL ) { - // get object attributes from template directory - } - - - DirectoryNameString.Length = lstrlenW(lpNewDirectory)*sizeof(WCHAR); - DirectoryNameString.Buffer = (WCHAR *)lpNewDirectory; - DirectoryNameString.MaximumLength = DirectoryNameString.Length+sizeof(WCHAR); + DirectoryNameString.Length = lstrlenW(lpNewDirectory)*sizeof(WCHAR); + DirectoryNameString.Buffer = (WCHAR *)lpNewDirectory; + DirectoryNameString.MaximumLength = DirectoryNameString.Length+sizeof(WCHAR); - ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); - ObjectAttributes.RootDirectory = NULL; - ObjectAttributes.ObjectName = &DirectoryNameString; - ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; - ObjectAttributes.SecurityDescriptor = NULL; - ObjectAttributes.SecurityQualityOfService = NULL; + ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); + ObjectAttributes.RootDirectory = NULL; + ObjectAttributes.ObjectName = &DirectoryNameString; + ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; + ObjectAttributes.SecurityDescriptor = NULL; + ObjectAttributes.SecurityQualityOfService = NULL; + + errCode = ZwCreateFile(&DirectoryHandle, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_DIRECTORY, + 0, + FILE_CREATE, + 0, + NULL, + 0); - - errCode = NtCreateDirectoryObject( - &DirectoryHandle, - GENERIC_ALL, - &ObjectAttributes - ); - if (!NT_SUCCESS(errCode) ) { - SetLastError(RtlNtStatusToDosError(errCode)); - return FALSE; - } - return TRUE; + if (!NT_SUCCESS(errCode)) + { + SetLastError(RtlNtStatusToDosError(errCode)); + return FALSE; + } + + NtClose(DirectoryHandle); + + return TRUE; } -WINBOOL -STDCALL -RemoveDirectoryA( - LPCSTR lpPathName - ) +WINBOOL STDCALL RemoveDirectoryA(LPCSTR lpPathName) { WCHAR PathNameW[MAX_PATH]; ULONG i; @@ -127,45 +136,37 @@ RemoveDirectoryA( } -WINBOOL -STDCALL -RemoveDirectoryW( - LPCWSTR lpPathName - ) +WINBOOL STDCALL RemoveDirectoryW(LPCWSTR lpPathName) { - NTSTATUS errCode; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING PathNameString; + NTSTATUS errCode; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING PathNameString; + + PathNameString.Length = lstrlenW(lpPathName)*sizeof(WCHAR); + PathNameString.Buffer = (WCHAR *)lpPathName; + PathNameString.MaximumLength = PathNameString.Length+sizeof(WCHAR); + + ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); + ObjectAttributes.RootDirectory = NULL; + ObjectAttributes.ObjectName = &PathNameString; + ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; + ObjectAttributes.SecurityDescriptor = NULL; + ObjectAttributes.SecurityQualityOfService = NULL; + + errCode = NtDeleteFile(&ObjectAttributes); - PathNameString.Length = lstrlenW(lpPathName)*sizeof(WCHAR); - PathNameString.Buffer = (WCHAR *)lpPathName; - PathNameString.MaximumLength = PathNameString.Length+sizeof(WCHAR); - - ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); - ObjectAttributes.RootDirectory = NULL; - ObjectAttributes.ObjectName = &PathNameString; - ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; - ObjectAttributes.SecurityDescriptor = NULL; - ObjectAttributes.SecurityQualityOfService = NULL; - - errCode = NtDeleteFile( - &ObjectAttributes - ); - if (!NT_SUCCESS(errCode) ) { - SetLastError(RtlNtStatusToDosError(errCode)); - return FALSE; - } - return TRUE; + if (!NT_SUCCESS(errCode)) + { + SetLastError(RtlNtStatusToDosError(errCode)); + return FALSE; + } + return TRUE; } -DWORD -STDCALL -GetFullPathNameA( - LPCSTR lpFileName, - DWORD nBufferLength, - LPSTR lpBuffer, - LPSTR *lpFilePart - ) +DWORD STDCALL GetFullPathNameA(LPCSTR lpFileName, + DWORD nBufferLength, + LPSTR lpBuffer, + LPSTR *lpFilePart) { } diff --git a/reactos/lib/kernel32/file/find-bak.c b/reactos/lib/kernel32/file/find-bak.c deleted file mode 100644 index 80a3a4e1a3c..00000000000 --- a/reactos/lib/kernel32/file/find-bak.c +++ /dev/null @@ -1,450 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: lib/kernel32/file/find.c - * PURPOSE: Find functions - * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) - * UPDATE HISTORY: - * Created 01/11/98 - */ -#include -#include -#include - -typedef enum _FINDEX_INFO_LEVELS -{ - FindExSearchNameMatch, - FindExSearchLimitToDirectories, - FindExSearchLimitToDevices, - -} FINDEX_INFO_LEVELS ; - -typedef enum _FINDEX_SEARCH_OPS -{ - FindExInfoStandard - -} FINDEX_SEARCH_OPS; - -int wcharicmp ( WCHAR char1, WCHAR char2 ); - -WINBOOL -mfs_regexp(LPCWSTR lpFileName,LPCWSTR lpFilter); - -HANDLE -STDCALL -FindFirstFileW( - LPCWSTR lpFileName, - LPWIN32_FIND_DATA lpFindFileData - ); - -WINBOOL -STDCALL -FindNextFileW( - HANDLE hFind, - LPWIN32_FIND_DATA lpFindFileData - ); - -HANDLE -STDCALL -FindFirstFileExA( - LPCSTR lpFileName, - FINDEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFindFileData, - FINDEX_SEARCH_OPS fSearchOp, - LPVOID lpSearchFilter, - DWORD dwAdditionalFlags - ); - -HANDLE -STDCALL -FindFirstFileExW( - LPCWSTR lpFileName, - FINDEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFindFileData, - FINDEX_SEARCH_OPS fSearchOp, - LPVOID lpSearchFilter, - DWORD dwAdditionalFlags - ); - -typedef struct _FIND_FILE_INFO -{ - ULONG Offset; - PVOID SearchFilter; - WCHAR FileName[MAX_PATH]; - WCHAR PathName[MAX_PATH]; - FILE_DIRECTORY_INFORMATION *FileDirectory; -} FIND_FILE_INFO; - -typedef struct _WIN32_FIND_DATAW { - DWORD dwFileAttributes; - FILETIME ftCreationTime; - FILETIME ftLastAccessTime; - FILETIME ftLastWriteTime; - DWORD nFileSizeHigh; - DWORD nFileSizeLow; - DWORD dwReserved0; - DWORD dwReserved1; - WCHAR cFileName[ MAX_PATH ]; - WCHAR cAlternateFileName[ 14 ]; -} WIN32_FIND_DATAW, *LPWIN32_FIND_DATAW, *PWIN32_FIND_DATAW; - - -WINBOOL -STDCALL -FindClose( - HANDLE hFind - ) -{ - - if ( hFind == NULL) - return FALSE; - - - HeapFree(GetProcessHeap(),0,((FIND_FILE_INFO *)hFind)->FileDirectory); - HeapFree(GetProcessHeap(),0,hFind); - return TRUE; -} - - -HANDLE -STDCALL -FindFirstFileA( - LPCSTR lpFileName, - LPWIN32_FIND_DATA lpFindFileData - ) -{ - WIN32_FIND_DATA FindFileDataW; - WCHAR FileNameW[MAX_PATH]; - ULONG i; - - i = 0; - while ((*lpFileName)!=0 && i < MAX_PATH) - { - FileNameW[i] = *lpFileName; - lpFileName++; - i++; - } - FileNameW[i] = 0; - FindFirstFileW(FileNameW,&FindFileDataW); - - // converteer FindFileDataW - -} - -HANDLE -STDCALL -FindFirstFileW( - LPCWSTR lpFileName, - LPWIN32_FIND_DATA lpFindFileData - ) -{ - return FindFirstFileExW(lpFileName,FindExInfoStandard,lpFindFileData,FindExSearchNameMatch,NULL,0); -} - -WINBOOL -STDCALL -FindNextFileA( - HANDLE hFind, - LPWIN32_FIND_DATA lpFindFileData - ) -{ - WIN32_FIND_DATA FindFileDataW; - FindNextFileW(hFind,&FindFileDataW); - // converteer FindFileDataW -} - -WINBOOL -STDCALL -FindNextFileW( - HANDLE hFind, - LPWIN32_FIND_DATA lpFindFileData - ) -{ - int i; - WCHAR *pNameRead; - WCHAR FileName[MAX_PATH]; - - FIND_FILE_INFO *FindPtr = hFind; - FILE_DIRECTORY_INFORMATION *FileDirectory; - - if ( FindPtr == NULL ) - return FALSE; - - /* Try to find a file */ - FileDirectory = FindPtr->Offset + FindPtr->FileDirectory; - while ( FileDirectory->NextEntryOffset != 0 ) { - - pNameRead = FileDirectory->FileName; - FindPtr->Offset += FileDirectory->NextEntryOffset; - for(i=0;iFileNameLength;i++) - dprintf("%c\n",(char)pNameRead[i]); - if (mfs_regexp(pNameRead, FindPtr->FileName)) - { - /* We found one! */ - if (FindPtr->PathName[0] != L'\0') - { - lstrcpyW(lpFindFileData->cFileName, FindPtr->PathName); - lstrcatW(lpFindFileData->cFileName, L"/"); - lstrcatW(lpFindFileData->cFileName, pNameRead); - } - else - - lstrcpyW(lpFindFileData->cFileName, pNameRead); - - - - lstrcpyW(lpFindFileData->cAlternateFileName, L""); - lpFindFileData->dwReserved0 = 0; - lpFindFileData->dwReserved1 = 0; - return TRUE; - } - FileDirectory = FindPtr->Offset + FindPtr->FileDirectory; - } - return FALSE; -} - - -HANDLE -STDCALL -FindFirstFileExA( - LPCSTR lpFileName, - FINDEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFindFileData, - FINDEX_SEARCH_OPS fSearchOp, - LPVOID lpSearchFilter, - DWORD dwAdditionalFlags - ) -{ - WCHAR FileNameW[MAX_PATH]; - WIN32_FIND_DATAW FindFileDataW; - FindFirstFileExW(FileNameW,fInfoLevelId,&FindFileDataW,fSearchOp,lpSearchFilter,dwAdditionalFlags); - // conerteer FindFileDataW - -} - -HANDLE -STDCALL -FindFirstFileExW( - LPCWSTR lpFileName, - FINDEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFindFileData, - FINDEX_SEARCH_OPS fSearchOp, - LPVOID lpSearchFilter, - DWORD dwAdditionalFlags - ) -{ - NTSTATUS errCode; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE FileHandle = NULL; - FIND_FILE_INFO *hFind; - WCHAR *FilePart; - UNICODE_STRING FileNameString, PathNameString; - OBJECT_ATTRIBUTES ObjectAttributes; - - - ACCESS_MASK DesiredAccess=FILE_READ_DATA; - - ULONG FileAttributes=FILE_ATTRIBUTE_DIRECTORY; - ULONG ShareAccess=FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; - ULONG CreateDisposition=FILE_OPEN; - ULONG CreateOptions=FILE_DIRECTORY_FILE; - - - hFind = HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,sizeof(FIND_FILE_INFO)); - - hFind->FileDirectory = HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,8192); - - - - /* Try to find a path and a filename in the passed filename */ - - lstrcpyW(hFind->PathName, lpFileName); - FilePart = wcsrchr(hFind->PathName, '\\'); - - if (FilePart == NULL){ - GetCurrentDirectory(MAX_PATH, hFind->PathName); - lstrcpyW(hFind->FileName, lpFileName); - } - else { - FilePart[0] = L'\0'; - lstrcpyW(hFind->FileName, &FilePart[1]); - } - - hFind->Offset = 0; - - - PathNameString.Length = lstrlenW(hFind->PathName)*sizeof(WCHAR); - PathNameString.Buffer = hFind->PathName; - PathNameString.MaximumLength = FileNameString.Length; - - - FileNameString.Length = lstrlenW(hFind->FileName)*sizeof(WCHAR); - FileNameString.Buffer = hFind->FileName; - FileNameString.MaximumLength = FileNameString.Length; - - - ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); - ObjectAttributes.RootDirectory = NULL; - ObjectAttributes.ObjectName = &PathNameString; - ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; - ObjectAttributes.SecurityDescriptor = NULL; - ObjectAttributes.SecurityQualityOfService = NULL; - - - - - - - errCode = NtCreateFile( - &FileHandle, - DesiredAccess, - &ObjectAttributes, - &IoStatusBlock, - NULL, // AllocationSize - FileAttributes, - ShareAccess, - CreateDisposition, - CreateOptions, - NULL, // EaBuffer - 0); // - - if ( !NT_SUCCESS(errCode) ) { - printf("%x\n",errCode); - return NULL; - } - - errCode = NtQueryDirectoryFile( - FileHandle, - NULL, - NULL, - NULL, - &IoStatusBlock, - hFind->FileDirectory, - 8192, - FileDirectoryInformation, - FALSE, - &FileNameString, - FALSE - ); - if ( !NT_SUCCESS(errCode) ) { - printf("%x\n",errCode); - return NULL; - } - - - - - if ( FindNextFileW(hFind,lpFindFileData) ) - return hFind; - else { - FindClose(hFind); - return NULL; - } - return NULL; -} - -/************************************************************************/ -WINBOOL -mfs_regexp(LPCWSTR lpFileName,LPCWSTR lpFilter) -{ - /* The following code is provided by Tarang and I trust him... - */ - LPWSTR lpTempFileName = (LPWSTR)lpFileName; - LPWSTR lpTempFilter = (LPWSTR)lpFilter; - WCHAR TempToken [ 2 ]; - WCHAR TempFilter [ 2 ]; - WINBOOL Matched = FALSE; - - if ( ( ! (LPWSTR)lpFileName ) || ( ! *(LPWSTR)lpFileName ) || - ( ! (LPWSTR)lpFilter ) || ( ! *(LPWSTR)lpFilter ) ) - return 0L; - - if ( ! lstrcmpW ( ( LPSTR )lpFilter, "*.*" ) ) - { - wsprintf ( TempFilter, "*" ); - lpTempFilter = TempFilter; - lpFilter = TempFilter; - } - - while ( ( lpTempFilter ) && ( *lpTempFilter ) && ( ! Matched ) ) - { - memset ( TempToken, 0, sizeof ( TempToken ) ); - switch ( *lpTempFilter ) - { - default: - if ( wcharicmp ( *lpTempFileName, *lpTempFilter ) ) - { - lpTempFileName = (LPWSTR)lpFileName; - lpTempFilter = wcspbrk ( lpTempFilter, L" ,;" ); - if ( lpTempFilter ) - lpTempFilter+=sizeof(WCHAR); - } - else - { - lpTempFilter+=sizeof(WCHAR); - lpTempFileName+=sizeof(WCHAR); - switch ( *lpTempFilter ) - { - default: - break; - - case L'\0': - case L' ': - case L',': - case L';': - if ( ! *lpTempFileName ) - Matched = TRUE; - break; - } - } - break; - - case L'?': - lpTempFilter+=sizeof(WCHAR); - lpTempFileName+=sizeof(WCHAR); - break; - - case L'*': - lpTempFilter += sizeof(WCHAR); - if ( ! ( TempToken [ 0 ] = *( lpTempFilter ) ) ) - Matched = TRUE; - else - { - lpTempFilter+=sizeof(WCHAR); - while ( ( lpTempFileName = wcspbrk ( lpTempFileName, TempToken ) ) && - ( ! Matched ) ) { - lpTempFileName+= sizeof(WCHAR); - Matched = mfs_regexp ( lpTempFileName, lpTempFilter ); - } - if ( ( ! lpTempFileName ) && ( ! Matched ) ) - { - lpTempFileName = (LPWSTR)lpFileName; - lpTempFilter = wcspbrk ( lpTempFilter, L" ,;" ); - if ( lpTempFilter ) - lpTempFilter+=sizeof(WCHAR); - } - } - break; - - case L'\0': - case L' ': - case L',': - case L';': - Matched = TRUE; - break; - } - } - - return (DWORD)Matched; - - -} - -int wcharicmp ( WCHAR char1, WCHAR char2 ) -{ - WCHAR Char1 = ( L'a' <= char1 ) && ( char1 <= L'z' ) ? - char1 - L'a' + L'A' : char1; - WCHAR Char2 = ( L'a' <= char2 ) && ( char2 <= L'z' ) ? - char2 - L'a' + L'A' : char2; - return ( Char2 - Char1 ); -} diff --git a/reactos/lib/kernel32/file/find.c b/reactos/lib/kernel32/file/find.c index e303ea8f387..e0685c8e390 100644 --- a/reactos/lib/kernel32/file/find.c +++ b/reactos/lib/kernel32/file/find.c @@ -78,16 +78,17 @@ WINBOOL STDCALL InternalFindNextFile(HANDLE hFindFile, &(IData->PatternStr), FALSE); DPRINT("Found %w\n",IData->FileInfo.FileName); - lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes; if (Status != STATUS_SUCCESS) { return(FALSE); } + + FileDataToWin32Data(lpFindFileData, IData); + return(TRUE); } -static FileDataToWin32Data(LPWIN32_FIND_DATA lpFindFileData - ,PKERNEL32_FIND_FILE_DATA IData) +static FileDataToWin32Data(LPWIN32_FIND_DATA lpFindFileData, PKERNEL32_FIND_FILE_DATA IData) { int i; lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes; @@ -96,16 +97,7 @@ static FileDataToWin32Data(LPWIN32_FIND_DATA lpFindFileData // memcpy(&lpFindFileData->ftLastWriteTime,&IData->FileInfo.LastWriteTime,sizeof(FILETIME)); lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile>>32; lpFindFileData->nFileSizeLow = IData->FileInfo.EndOfFile; - for (i=0; iFileInfo.FileNameLength; i++) - { - lpFindFileData->cFileName[i] = IData->FileInfo.FileName[i]; - } - lpFindFileData->cFileName[i] = 0; - for(i=0;iFileInfo.ShortNameLength;i++) - { - lpFindFileData->cAlternateFileName[i] = IData->FileInfo.ShortName[i]; - } - lpFindFileData->cAlternateFileName[i] = 0; + } HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName, @@ -180,6 +172,7 @@ HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName, FALSE); DPRINT("Found %w\n",IData->FileInfo.FileName); + FileDataToWin32Data(lpFindFileData, IData); return(IData); } @@ -203,9 +196,31 @@ HANDLE FindFirstFileA(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) if (IData == NULL) { DPRINT("Failing request\n"); - return(NULL); + return(INVALID_HANDLE_VALUE); } - FileDataToWin32Data(lpFindFileData,IData); + + + Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData; + + DPRINT("IData->FileInfo.FileNameLength %d\n", + IData->FileInfo.FileNameLength); + for (i=0; iFileInfo.FileNameLength; i++) + { + Ret->cFileName[i] = IData->FileInfo.FileName[i]; + } + Ret->cFileName[i] = 0; + + DPRINT("IData->FileInfo.ShortNameLength %d\n", + IData->FileInfo.ShortNameLength); + if (IData->FileInfo.ShortNameLength > 13) + { + IData->FileInfo.ShortNameLength = 13; + } + for (i=0; iFileInfo.ShortNameLength; i++) + { + Ret->cAlternateFileName[i] = IData->FileInfo.ShortName[i]; + } + Ret->cAlternateFileName[i] = 0; return(IData); @@ -224,11 +239,28 @@ WINBOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData) } if (!InternalFindNextFile(hFindFile, lpFindFileData)) { - return(FALSE); + DPRINT("InternalFindNextFile() failed\n"); + return(FALSE); } Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData; - FileDataToWin32Data(lpFindFileData,IData); + + DPRINT("IData->FileInfo.FileNameLength %d\n", + IData->FileInfo.FileNameLength); + for (i=0; iFileInfo.FileNameLength; i++) + { + Ret->cFileName[i] = IData->FileInfo.FileName[i]; + } + Ret->cFileName[i] = 0; + + DPRINT("IData->FileInfo.ShortNameLength %d\n", + IData->FileInfo.ShortNameLength); + for (i=0; iFileInfo.ShortNameLength; i++) + { + Ret->cAlternateFileName[i] = IData->FileInfo.ShortName[i]; + } + Ret->cAlternateFileName[i] = 0; + return(TRUE); } @@ -236,7 +268,7 @@ BOOL FindClose(HANDLE hFindFile) { PKERNEL32_FIND_FILE_DATA IData; - dprintf("FindClose(hFindFile %x)\n",hFindFile); + DPRINT("FindClose(hFindFile %x)\n",hFindFile); IData = (PKERNEL32_FIND_FILE_DATA)hFindFile; NtClose(IData->DirectoryHandle); @@ -253,17 +285,12 @@ HANDLE STDCALL FindFirstFileW(LPCWSTR lpFileName, IData = InternalFindFirstFile(lpFileName,lpFindFileData); Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData; - FileDataToWin32Data(lpFindFileData,IData); - for (i=0; iFileInfo.FileNameLength; i++) - { - Ret->cFileName[i] = IData->FileInfo.FileName[i]; - } - Ret->cFileName[i] = 0; - for(i=0;iFileInfo.ShortNameLength;i++) - { - Ret->cAlternateFileName[i] = IData->FileInfo.ShortName[i]; - } + memcpy(Ret->cFileName, IData->FileInfo.FileName, + IData->FileInfo.FileNameLength); + memset(Ret->cAlternateFileName, IData->FileInfo.ShortName, + IData->FileInfo.ShortNameLength); + return(IData); } @@ -282,17 +309,11 @@ WINBOOL STDCALL FindNextFileW(HANDLE hFindFile, } Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData; - FileDataToWin32Data(lpFindFileData,IData); - for (i=0; iFileInfo.FileNameLength; i++) - { - Ret->cFileName[i] = IData->FileInfo.FileName[i]; - } - Ret->cFileName[i] = 0; - for(i=0;iFileInfo.ShortNameLength;i++) - { - Ret->cAlternateFileName[i] = IData->FileInfo.ShortName[i]; - } + memcpy(Ret->cFileName, IData->FileInfo.FileName, + IData->FileInfo.FileNameLength); + memcpy(Ret->cAlternateFileName, IData->FileInfo.ShortName, + IData->FileInfo.ShortNameLength); return(TRUE); } diff --git a/reactos/makefile_rex b/reactos/makefile_rex index 68e76f53bf2..2470f210746 100644 --- a/reactos/makefile_rex +++ b/reactos/makefile_rex @@ -31,8 +31,8 @@ LOADERS = dos # Select the device drivers and filesystems you want # KERNEL_SERVICES = parallel keyboard blues null mouse serial sound ide test sdisk \ - minix vfat # ext2fs - + minix vfat ext2 + APPS = hello shell all: $(COMPONENTS) $(LOADERS) $(KERNEL_SERVICES) $(APPS) @@ -107,8 +107,8 @@ serial: dummy sound: dummy make -C services/dd/sound -ext2fs: dummy - make -C services/fs/ext2fs +ext2: dummy + make -C services/fs/ext2 # # Kernel loaders diff --git a/reactos/ntoskrnl/io/buildirp.c b/reactos/ntoskrnl/io/buildirp.c index 0a489e2daf4..1f422162b85 100644 --- a/reactos/ntoskrnl/io/buildirp.c +++ b/reactos/ntoskrnl/io/buildirp.c @@ -285,15 +285,17 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction, { if (StartingOffset != NULL) { -DPRINT("StartingOffset:%ld:%ld\n", - GET_LARGE_INTEGER_HIGH_PART(*StartingOffset), - GET_LARGE_INTEGER_LOW_PART(*StartingOffset)); + DPRINT("StartingOffset:%ld:%ld\n", + GET_LARGE_INTEGER_HIGH_PART(*StartingOffset), + GET_LARGE_INTEGER_LOW_PART(*StartingOffset)); StackPtr->Parameters.Read.ByteOffset = *StartingOffset; } else { - SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Read.ByteOffset, 0); - SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Read.ByteOffset, 0); + SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Read.ByteOffset, + 0); + SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Read.ByteOffset, + 0); } } else @@ -304,8 +306,10 @@ DPRINT("StartingOffset:%ld:%ld\n", } else { - SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Write.ByteOffset, 0); - SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Write.ByteOffset, 0); + SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Write.ByteOffset, + 0); + SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Write.ByteOffset, + 0); } } diff --git a/reactos/ntoskrnl/io/cleanup.c b/reactos/ntoskrnl/io/cleanup.c index 505a7fb25a2..856d4f7ccb5 100644 --- a/reactos/ntoskrnl/io/cleanup.c +++ b/reactos/ntoskrnl/io/cleanup.c @@ -31,12 +31,14 @@ VOID IoReadWriteCompletion(PDEVICE_OBJECT DeviceObject, DPRINT("FileObject %x\n",FileObject); - if (DeviceObject->Flags & DO_BUFFERED_IO && - IoStack->MajorFunction == IRP_MJ_READ) + if (DeviceObject->Flags & DO_BUFFERED_IO) { - DPRINT("Copying buffered io back to user\n"); - memcpy(Irp->UserBuffer,Irp->AssociatedIrp.SystemBuffer, - IoStack->Parameters.Read.Length); + if (IoStack->MajorFunction == IRP_MJ_READ) + { + DPRINT("Copying buffered io back to user\n"); + memcpy(Irp->UserBuffer,Irp->AssociatedIrp.SystemBuffer, + IoStack->Parameters.Read.Length); + } ExFreePool(Irp->AssociatedIrp.SystemBuffer); } if (DeviceObject->Flags & DO_DIRECT_IO) diff --git a/reactos/ntoskrnl/io/create.c b/reactos/ntoskrnl/io/create.c index 7b840010ce0..cb2fb56828d 100644 --- a/reactos/ntoskrnl/io/create.c +++ b/reactos/ntoskrnl/io/create.c @@ -17,7 +17,7 @@ #include #include -//#define NDEBUG +#define NDEBUG #include /* FUNCTIONS *************************************************************/ diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 3c8f2f32196..889f2ab0708 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -197,7 +197,8 @@ PIRP IoAllocateIrp(CCHAR StackSize, BOOLEAN ChargeQuota) DPRINT("IoAllocateIrp(StackSize %d ChargeQuota %d)\n", StackSize, ChargeQuota); - if (ChargeQuota) +// if (ChargeQuota) + if (0) { Irp = ExAllocatePoolWithQuota(NonPagedPool,IoSizeOfIrp(StackSize)); } diff --git a/reactos/ntoskrnl/io/rw.c b/reactos/ntoskrnl/io/rw.c index efd5cba540f..344e49866d7 100644 --- a/reactos/ntoskrnl/io/rw.c +++ b/reactos/ntoskrnl/io/rw.c @@ -95,16 +95,6 @@ NTSTATUS ZwReadFile(HANDLE FileHandle, StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr->FileObject = FileObject; - StackPtr->Parameters.Read.Length = Length; - if (ByteOffset!=NULL) - { - StackPtr->Parameters.Read.ByteOffset = *ByteOffset; - } - else - { - SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Read.ByteOffset, 0); - SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Read.ByteOffset, 0); - } if (Key!=NULL) { StackPtr->Parameters.Read.Key = *Key; @@ -114,7 +104,6 @@ NTSTATUS ZwReadFile(HANDLE FileHandle, StackPtr->Parameters.Read.Key = 0; } - DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject); Status = IoCallDriver(FileObject->DeviceObject,Irp); if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO)) { diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index f12f425c202..039fc83dfa6 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -3,7 +3,7 @@ * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pool.c * PURPOSE: Implements the kernel memory pool - * PROGRAMMER: David Welch (welch@mcmail.com) + * PROGRAMMER: David Welch (welch@cwcom.net) * UPDATE HISTORY: * 27/05/98: Created * 10/06/98: Bug fixes by Iwan Fatahi (i_fatahi@hotmail.com) @@ -34,6 +34,12 @@ #define VALIDATE_POOL #endif +#if 0 +#define POOL_TRACE(args...) do { DbgPrint(args); } while(0); +#else +#define POOL_TRACE(args...) +#endif + /* TYPES *******************************************************************/ #define BLOCK_HDR_MAGIC (0xdeadbeef) @@ -534,8 +540,8 @@ asmlinkage VOID ExFreePool(PVOID block) block_hdr* blk=address_to_block(block); OLD_DPRINT("(%s:%d) freeing block %x\n",__FILE__,__LINE__,blk); -// DbgPrint("ExFreePool(block %x), size %d, caller %x\n",block,blk->size, -// ((PULONG)&block)[-1]); + POOL_TRACE("ExFreePool(block %x), size %d, caller %x\n",block,blk->size, + ((PULONG)&block)[-1]); VALIDATE_POOL; @@ -596,10 +602,16 @@ static void defrag_free_list(void) DPRINT("Finish To defrag free blocks,max=%d\n",max); } -PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag) +PVOID ExAllocateNonPagedPoolWithTag(ULONG type, + ULONG size, + ULONG Tag, + PVOID Caller) { block_hdr* current=NULL; - void* block; + PVOID block; + + POOL_TRACE("ExAllocatePool(NumberOfBytes %d) caller %x ", + size,Caller); // DbgPrint("Blocks on free list %d\n",nr_free_blocks); // DbgPrint("Blocks on used list %d\n",eiNrUsedblocks); @@ -611,6 +623,7 @@ PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag) */ if (size==0) { + POOL_TRACE("= NULL\n"); return(NULL); } @@ -635,43 +648,48 @@ PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag) block=take_block(current,size); VALIDATE_POOL; memset(block,0,size); + POOL_TRACE("= %x\n",block); return(block); } current=current->next; } - if(EiFreeNonPagedPool>size+32*PAGESIZE) - {//try defrag free list before growing kernel pool - defrag_free_list(); - /* - * reLook after defrag - */ - current=free_list_head; - while (current!=NULL) + if(EiFreeNonPagedPool>size+32*PAGESIZE) + {//try defrag free list before growing kernel pool + defrag_free_list(); + /* + * reLook after defrag + */ + current=free_list_head; + + while (current!=NULL) { - OLD_DPRINT("current %x size %x next %x\n",current,current->size, - current->next); - if (current->magic != BLOCK_HDR_MAGIC) - { - DbgPrint("Bad block magic (probable pool corruption)\n"); - KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT); - } - if (current->size>=size) - { - OLD_DPRINT("found block %x of size %d\n",current,size); - block=take_block(current,size); - memset(block,0,size); - return(block); - } - current=current->next; + OLD_DPRINT("current %x size %x next %x\n",current,current->size, + current->next); + if (current->magic != BLOCK_HDR_MAGIC) + { + DbgPrint("Bad block magic (probable pool corruption)\n"); + KeBugCheck(KBUG_POOL_FREE_LIST_CORRUPT); + } + if (current->size>=size) + { + OLD_DPRINT("found block %x of size %d\n",current,size); + block=take_block(current,size); + memset(block,0,size); + POOL_TRACE("= %x\n",block); + return(block); + } + current=current->next; } - } + } + /* * Otherwise create a new block */ block=block_to_address(grow_kernel_pool(size)); VALIDATE_POOL; memset(block,0,size); + POOL_TRACE("= %x\n",block); return(block); } diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c index e654c5c8f7d..ebdbf9d9495 100644 --- a/reactos/ntoskrnl/mm/pool.c +++ b/reactos/ntoskrnl/mm/pool.c @@ -45,43 +45,46 @@ PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes) */ { PVOID Block; -// DbgPrint("ExAllocatePool(NumberOfBytes %d) caller %x\n", -// NumberOfBytes,((PULONG)&PoolType)[-1]); - Block = ExAllocatePoolWithTag(PoolType,NumberOfBytes,TAG_NONE); -// DbgPrint("ExAllocatePool() = %x\n",Block); + Block = ExAllocateNonPagedPoolWithTag(PoolType, + NumberOfBytes, + TAG_NONE, + (&PoolType)[-1]); return(Block); } -PVOID ExAllocatePoolWithTag(ULONG type, ULONG size, ULONG Tag) +PVOID ExAllocatePoolWithTag(ULONG PoolType, ULONG NumberOfBytes, ULONG Tag) { PVOID Block; - if (type == NonPagedPoolCacheAligned || - type == NonPagedPoolCacheAlignedMustS) + if (PoolType == NonPagedPoolCacheAligned || + PoolType == NonPagedPoolCacheAlignedMustS) { UNIMPLEMENTED; } - switch(type) + switch(PoolType) { case NonPagedPool: case NonPagedPoolMustSucceed: case NonPagedPoolCacheAligned: case NonPagedPoolCacheAlignedMustS: - Block = ExAllocateNonPagedPoolWithTag(type,size,Tag); + Block = ExAllocateNonPagedPoolWithTag(PoolType, + NumberOfBytes, + Tag, + (&PoolType)[-1]); break; case PagedPool: case PagedPoolCacheAligned: - Block = ExAllocatePagedPoolWithTag(type,size,Tag); + Block = ExAllocatePagedPoolWithTag(PoolType,NumberOfBytes,Tag); break; default: return(NULL); }; - if ((type==NonPagedPoolMustSucceed || type==NonPagedPoolCacheAlignedMustS) - && Block==NULL) + if ((PoolType==NonPagedPoolMustSucceed || + PoolType==NonPagedPoolCacheAlignedMustS) && Block==NULL) { KeBugCheck(MUST_SUCCEED_POOL_EMPTY); } diff --git a/reactos/ntoskrnl/ps/kill.c b/reactos/ntoskrnl/ps/kill.c index b373485a7d0..bad5ee8dac9 100644 --- a/reactos/ntoskrnl/ps/kill.c +++ b/reactos/ntoskrnl/ps/kill.c @@ -120,6 +120,12 @@ NTSTATUS STDCALL ZwTerminateThread(IN HANDLE ThreadHandle, } VOID PsReleaseThread(PETHREAD Thread) +/* + * FUNCTION: Called internally to release a thread's resources from another + * thread's context + * ARGUMENTS: + * Thread = Thread to release + */ { DPRINT("PsReleaseThread(Thread %x)\n",Thread);