mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 06:55:55 +00:00
Fixed some bugs
svn path=/trunk/; revision=190
This commit is contained in:
parent
97b7ce3ac3
commit
1908a698e8
21 changed files with 308 additions and 712 deletions
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 ***************************************************************/
|
||||
|
|
|
@ -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)));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -553,7 +553,6 @@ typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
|
|||
*/
|
||||
|
||||
typedef struct _FILE_NOTIFY_INFORMATION {
|
||||
ULONG NextEntryOffset;
|
||||
ULONG Action;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[0];
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include <ddk/li.h>
|
||||
#include <ddk/rtl.h>
|
||||
|
||||
//#define NDEBUG
|
||||
#define NDEBUG
|
||||
#include <kernel32/kernel32.h>
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include <internal/string.h>
|
||||
#include <wstring.h>
|
||||
|
||||
//#define NDEBUG
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
/* FUNCTIONS *************************************************************/
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue