Fixed some bugs

svn path=/trunk/; revision=190
This commit is contained in:
David Welch 1999-01-20 19:02:05 +00:00
parent 97b7ce3ac3
commit 1908a698e8
21 changed files with 308 additions and 712 deletions

View file

@ -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

View file

@ -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,6 +128,8 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt,
StartIndex = 0;
}
DPRINT("StartIndex %d\n",StartIndex);
for (i=0; i<Max ;i++)
{
if (!Ext2ScanDir(DeviceExt,&Fcb->inode,"*",&dir_entry,&StartIndex))
@ -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,

View file

@ -11,9 +11,11 @@
/* INCLUDES ****************************************************************/
#include <ddk/ntddk.h>
#include <internal/debug.h>
#include <string.h>
#define NDEBUG
#include <internal/debug.h>
#include "ext2fs.h"
/* FUNCTIONS ***************************************************************/

View file

@ -51,6 +51,7 @@ ULONG Fat32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
ULONG FATsector;
ULONG FATeis;
PULONG Block;
Block = ExAllocatePool(NonPagedPool,1024);
FATsector=CurrentCluster/(512/sizeof(ULONG));
FATeis=CurrentCluster-(FATsector*(512/sizeof(ULONG)));

View file

@ -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

View file

@ -553,7 +553,6 @@ typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
*/
typedef struct _FILE_NOTIFY_INFORMATION {
ULONG NextEntryOffset;
ULONG Action;
ULONG FileNameLength;
WCHAR FileName[0];

View file

@ -1,11 +1,12 @@
#ifndef __INTERNAL_POOL_H
#define __INTERNAL_POOL_H
#include <windows.h>
#include <internal/linkage.h>
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 */

View file

@ -24,7 +24,7 @@
#include <ddk/li.h>
#include <ddk/rtl.h>
//#define NDEBUG
#define NDEBUG
#include <kernel32/kernel32.h>
/* FUNCTIONS ****************************************************************/

View file

@ -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 )

View file

@ -8,13 +8,19 @@
* Created 01/11/98
*/
/*
* NOTES: Changed to using ZwCreateFile
*/
/* INCLUDES ******************************************************************/
#include <windows.h>
#include <ddk/ntddk.h>
#include <string.h>
#include <wstring.h>
#include <ddk/rtl.h>
#define NDEBUG
#include <kernel32/kernel32.h>
/* FUNCTIONS *****************************************************************/
@ -48,39 +54,36 @@ 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);
}
WINBOOL
STDCALL
CreateDirectoryExW(
LPCWSTR lpTemplateDirectory,
WINBOOL STDCALL CreateDirectoryExW(LPCWSTR lpTemplateDirectory,
LPCWSTR lpNewDirectory,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
{
NTSTATUS errCode;
HANDLE DirectoryHandle;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING DirectoryNameString;
IO_STATUS_BLOCK IoStatusBlock;
if ( lpTemplateDirectory != NULL ) {
if ( lpTemplateDirectory != NULL )
{
// get object attributes from template directory
DPRINT("KERNEL32:FIXME:%s:%d\n",__FILE__,__LINE__);
return(FALSE);
}
DirectoryNameString.Length = lstrlenW(lpNewDirectory)*sizeof(WCHAR);
DirectoryNameString.Buffer = (WCHAR *)lpNewDirectory;
DirectoryNameString.MaximumLength = DirectoryNameString.Length+sizeof(WCHAR);
@ -92,26 +95,32 @@ CreateDirectoryExW(
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) ) {
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,11 +136,7 @@ RemoveDirectoryA(
}
WINBOOL
STDCALL
RemoveDirectoryW(
LPCWSTR lpPathName
)
WINBOOL STDCALL RemoveDirectoryW(LPCWSTR lpPathName)
{
NTSTATUS errCode;
OBJECT_ATTRIBUTES ObjectAttributes;
@ -148,24 +153,20 @@ RemoveDirectoryW(
ObjectAttributes.SecurityDescriptor = NULL;
ObjectAttributes.SecurityQualityOfService = NULL;
errCode = NtDeleteFile(
&ObjectAttributes
);
if (!NT_SUCCESS(errCode) ) {
errCode = NtDeleteFile(&ObjectAttributes);
if (!NT_SUCCESS(errCode))
{
SetLastError(RtlNtStatusToDosError(errCode));
return FALSE;
}
return TRUE;
}
DWORD
STDCALL
GetFullPathNameA(
LPCSTR lpFileName,
DWORD STDCALL GetFullPathNameA(LPCSTR lpFileName,
DWORD nBufferLength,
LPSTR lpBuffer,
LPSTR *lpFilePart
)
LPSTR *lpFilePart)
{
}

View file

@ -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 <windows.h>
#include <wstring.h>
#include <ddk/ntddk.h>
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;i<FileDirectory->FileNameLength;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 );
}

View file

@ -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; i<IData->FileInfo.FileNameLength; i++)
{
lpFindFileData->cFileName[i] = IData->FileInfo.FileName[i];
}
lpFindFileData->cFileName[i] = 0;
for(i=0;i<IData->FileInfo.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; i<IData->FileInfo.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; i<IData->FileInfo.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))
{
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; i<IData->FileInfo.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; i<IData->FileInfo.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; i<IData->FileInfo.FileNameLength; i++)
{
Ret->cFileName[i] = IData->FileInfo.FileName[i];
}
Ret->cFileName[i] = 0;
for(i=0;i<IData->FileInfo.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; i<IData->FileInfo.FileNameLength; i++)
{
Ret->cFileName[i] = IData->FileInfo.FileName[i];
}
Ret->cFileName[i] = 0;
for(i=0;i<IData->FileInfo.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);
}

View file

@ -31,7 +31,7 @@ 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
@ -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

View file

@ -285,15 +285,17 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction,
{
if (StartingOffset != NULL)
{
DPRINT("StartingOffset:%ld:%ld\n",
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);
}
}

View file

@ -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)
{
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)

View file

@ -17,7 +17,7 @@
#include <internal/string.h>
#include <wstring.h>
//#define NDEBUG
#define NDEBUG
#include <internal/debug.h>
/* FUNCTIONS *************************************************************/

View file

@ -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));
}

View file

@ -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))
{

View file

@ -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,10 +648,12 @@ 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();
@ -661,17 +676,20 @@ PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag)
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);
}

View file

@ -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);
}

View file

@ -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);