mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:03:00 +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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: services/fs/ext2/super.c
|
* FILE: services/fs/ext2/dir.c
|
||||||
* PURPOSE: ext2 filesystem
|
* PURPOSE: ext2 filesystem
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
* PROGRAMMER: David Welch (welch@cwcom.net)
|
||||||
* UPDATE HISTORY:
|
* UPDATE HISTORY:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -45,6 +45,9 @@ PVOID Ext2ProcessDirEntry(PDEVICE_EXTENSION DeviceExt,
|
||||||
PWSTR FileName;
|
PWSTR FileName;
|
||||||
struct ext2_inode inode;
|
struct ext2_inode inode;
|
||||||
|
|
||||||
|
DPRINT("FileIndex %d\n",FileIndex);
|
||||||
|
DPRINT("Buffer %x\n",Buffer);
|
||||||
|
|
||||||
Ext2ReadInode(DeviceExt,
|
Ext2ReadInode(DeviceExt,
|
||||||
dir_entry->inode,
|
dir_entry->inode,
|
||||||
&inode);
|
&inode);
|
||||||
|
@ -95,7 +98,10 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt,
|
||||||
struct ext2_dir_entry dir_entry;
|
struct ext2_dir_entry dir_entry;
|
||||||
ULONG CurrentIndex;
|
ULONG CurrentIndex;
|
||||||
|
|
||||||
|
DPRINT("Buffer %x\n",Buffer);
|
||||||
|
|
||||||
Buffer = Irp->UserBuffer;
|
Buffer = Irp->UserBuffer;
|
||||||
|
DPRINT("IoStack->Flags %x\n",IoStack->Flags);
|
||||||
|
|
||||||
if (IoStack->Flags & SL_RETURN_SINGLE_ENTRY)
|
if (IoStack->Flags & SL_RETURN_SINGLE_ENTRY)
|
||||||
{
|
{
|
||||||
|
@ -106,6 +112,8 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt,
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DPRINT("Buffer->FileIndex %d\n",
|
||||||
|
((PFILE_DIRECTORY_INFORMATION)Buffer)->FileIndex);
|
||||||
if (IoStack->Flags & SL_INDEX_SPECIFIED)
|
if (IoStack->Flags & SL_INDEX_SPECIFIED)
|
||||||
{
|
{
|
||||||
StartIndex = ((PFILE_DIRECTORY_INFORMATION)Buffer)->FileIndex;
|
StartIndex = ((PFILE_DIRECTORY_INFORMATION)Buffer)->FileIndex;
|
||||||
|
@ -120,6 +128,8 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt,
|
||||||
StartIndex = 0;
|
StartIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DPRINT("StartIndex %d\n",StartIndex);
|
||||||
|
|
||||||
for (i=0; i<Max ;i++)
|
for (i=0; i<Max ;i++)
|
||||||
{
|
{
|
||||||
if (!Ext2ScanDir(DeviceExt,&Fcb->inode,"*",&dir_entry,&StartIndex))
|
if (!Ext2ScanDir(DeviceExt,&Fcb->inode,"*",&dir_entry,&StartIndex))
|
||||||
|
@ -133,6 +143,7 @@ NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt,
|
||||||
Buffer,
|
Buffer,
|
||||||
StartIndex);
|
StartIndex);
|
||||||
}
|
}
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS Ext2DirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
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));
|
Fcb = ExAllocatePool(NonPagedPool, sizeof(EXT2_FCB));
|
||||||
|
|
||||||
unicode_to_ansi(name,FileName);
|
unicode_to_ansi(name,FileName);
|
||||||
DbgPrint("name %s\n",name);
|
DPRINT("name %s\n",name);
|
||||||
|
|
||||||
current_segment = strtok(name,"\\");
|
current_segment = strtok(name,"\\");
|
||||||
do
|
while (current_segment!=NULL)
|
||||||
{
|
{
|
||||||
Ext2ReadInode(DeviceExt,
|
Ext2ReadInode(DeviceExt,
|
||||||
current_inode,
|
current_inode,
|
||||||
|
@ -269,7 +280,7 @@ NTSTATUS Ext2OpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
|
||||||
}
|
}
|
||||||
current_inode = entry.inode;
|
current_inode = entry.inode;
|
||||||
current_segment = strtok(NULL,"\\");
|
current_segment = strtok(NULL,"\\");
|
||||||
} while(current_segment!=NULL);
|
};
|
||||||
DPRINT("Found file\n");
|
DPRINT("Found file\n");
|
||||||
|
|
||||||
Ext2ReadInode(DeviceExt,
|
Ext2ReadInode(DeviceExt,
|
||||||
|
|
|
@ -11,9 +11,11 @@
|
||||||
/* INCLUDES ****************************************************************/
|
/* INCLUDES ****************************************************************/
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <internal/debug.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <internal/debug.h>
|
||||||
|
|
||||||
#include "ext2fs.h"
|
#include "ext2fs.h"
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
|
@ -51,6 +51,7 @@ ULONG Fat32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
|
||||||
ULONG FATsector;
|
ULONG FATsector;
|
||||||
ULONG FATeis;
|
ULONG FATeis;
|
||||||
PULONG Block;
|
PULONG Block;
|
||||||
|
|
||||||
Block = ExAllocatePool(NonPagedPool,1024);
|
Block = ExAllocatePool(NonPagedPool,1024);
|
||||||
FATsector=CurrentCluster/(512/sizeof(ULONG));
|
FATsector=CurrentCluster/(512/sizeof(ULONG));
|
||||||
FATeis=CurrentCluster-(FATsector*(512/sizeof(ULONG)));
|
FATeis=CurrentCluster-(FATsector*(512/sizeof(ULONG)));
|
||||||
|
|
|
@ -86,9 +86,22 @@ enum
|
||||||
SL_ALLOW_RAW_MOUNT = 0x4000,
|
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_RESTART_SCAN (0x1)
|
||||||
#define SL_RETURN_SINGLE_ENTRY (0x2)
|
#define SL_RETURN_SINGLE_ENTRY (0x2)
|
||||||
#define SL_INDEX_SPECIFIED (0x3)
|
#define SL_INDEX_SPECIFIED (0x4)
|
||||||
|
|
||||||
#define SL_PENDING_RETURNED 0x01
|
#define SL_PENDING_RETURNED 0x01
|
||||||
#define SL_INVOKE_ON_CANCEL 0x20
|
#define SL_INVOKE_ON_CANCEL 0x20
|
||||||
|
@ -98,11 +111,8 @@ enum
|
||||||
/*
|
/*
|
||||||
* Possible flags for the device object flags
|
* Possible flags for the device object flags
|
||||||
*/
|
*/
|
||||||
enum
|
#define DO_BUFFERED_IO (0x1)
|
||||||
{
|
#define DO_DIRECT_IO (0x2)
|
||||||
DO_BUFFERED_IO = 0x1,
|
|
||||||
DO_DIRECT_IO = 0x2,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Possible device types
|
* Possible device types
|
||||||
|
|
|
@ -553,7 +553,6 @@ typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct _FILE_NOTIFY_INFORMATION {
|
typedef struct _FILE_NOTIFY_INFORMATION {
|
||||||
ULONG NextEntryOffset;
|
|
||||||
ULONG Action;
|
ULONG Action;
|
||||||
ULONG FileNameLength;
|
ULONG FileNameLength;
|
||||||
WCHAR FileName[0];
|
WCHAR FileName[0];
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
#ifndef __INTERNAL_POOL_H
|
#ifndef __INTERNAL_POOL_H
|
||||||
#define __INTERNAL_POOL_H
|
#define __INTERNAL_POOL_H
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include <internal/linkage.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 ExAllocatePagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag);
|
||||||
PVOID ExAllocateNonPagedPoolWithTag(POOL_TYPE Type, ULONG size, ULONG Tag);
|
|
||||||
|
|
||||||
#endif /* __INTERNAL_POOL_H */
|
#endif /* __INTERNAL_POOL_H */
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include <ddk/li.h>
|
#include <ddk/li.h>
|
||||||
#include <ddk/rtl.h>
|
#include <ddk/rtl.h>
|
||||||
|
|
||||||
//#define NDEBUG
|
#define NDEBUG
|
||||||
#include <kernel32/kernel32.h>
|
#include <kernel32/kernel32.h>
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
|
@ -94,12 +94,7 @@ WINBOOL STDCALL SetCurrentDirectoryW(LPCWSTR lpPathName)
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD
|
DWORD STDCALL GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer)
|
||||||
STDCALL
|
|
||||||
GetTempPathA(
|
|
||||||
DWORD nBufferLength,
|
|
||||||
LPSTR lpBuffer
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
WCHAR BufferW[MAX_PATH];
|
WCHAR BufferW[MAX_PATH];
|
||||||
DWORD retCode;
|
DWORD retCode;
|
||||||
|
@ -116,14 +111,8 @@ GetTempPathA(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD
|
DWORD STDCALL GetTempPathW(DWORD nBufferLength, LPWSTR lpBuffer)
|
||||||
STDCALL
|
|
||||||
GetTempPathW(
|
|
||||||
DWORD nBufferLength,
|
|
||||||
LPWSTR lpBuffer
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
WCHAR EnvironmentBufferW[MAX_PATH];
|
WCHAR EnvironmentBufferW[MAX_PATH];
|
||||||
UINT i;
|
UINT i;
|
||||||
|
|
||||||
|
@ -137,12 +126,7 @@ GetTempPathW(
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT
|
UINT STDCALL GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize)
|
||||||
STDCALL
|
|
||||||
GetSystemDirectoryA(
|
|
||||||
LPSTR lpBuffer,
|
|
||||||
UINT uSize
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
UINT uPathSize,i;
|
UINT uPathSize,i;
|
||||||
if ( lpBuffer == NULL )
|
if ( lpBuffer == NULL )
|
||||||
|
@ -161,12 +145,7 @@ GetSystemDirectoryA(
|
||||||
return uPathSize;
|
return uPathSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT
|
UINT STDCALL GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize)
|
||||||
STDCALL
|
|
||||||
GetWindowsDirectoryA(
|
|
||||||
LPSTR lpBuffer,
|
|
||||||
UINT uSize
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
UINT uPathSize,i;
|
UINT uPathSize,i;
|
||||||
if ( lpBuffer == NULL )
|
if ( lpBuffer == NULL )
|
||||||
|
@ -184,8 +163,7 @@ GetWindowsDirectoryA(
|
||||||
return uPathSize;
|
return uPathSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT STDCALL GetSystemDirectoryW(LPWSTR lpBuffer,
|
UINT STDCALL GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize)
|
||||||
UINT uSize)
|
|
||||||
{
|
{
|
||||||
UINT uPathSize;
|
UINT uPathSize;
|
||||||
if ( lpBuffer == NULL )
|
if ( lpBuffer == NULL )
|
||||||
|
@ -198,8 +176,7 @@ UINT STDCALL GetSystemDirectoryW(LPWSTR lpBuffer,
|
||||||
return uPathSize;
|
return uPathSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT STDCALL GetWindowsDirectoryW(LPWSTR lpBuffer,
|
UINT STDCALL GetWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize)
|
||||||
UINT uSize)
|
|
||||||
{
|
{
|
||||||
UINT uPathSize;
|
UINT uPathSize;
|
||||||
if ( lpBuffer == NULL )
|
if ( lpBuffer == NULL )
|
||||||
|
|
|
@ -8,13 +8,19 @@
|
||||||
* Created 01/11/98
|
* Created 01/11/98
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTES: Changed to using ZwCreateFile
|
||||||
|
*/
|
||||||
|
|
||||||
/* INCLUDES ******************************************************************/
|
/* INCLUDES ******************************************************************/
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wstring.h>
|
#include <wstring.h>
|
||||||
#include <ddk/rtl.h>
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <kernel32/kernel32.h>
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
@ -48,39 +54,36 @@ WINBOOL STDCALL CreateDirectoryExA(LPCSTR lpTemplateDirectory,
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
NewDirectoryW[i] = 0;
|
NewDirectoryW[i] = 0;
|
||||||
return CreateDirectoryExW(TemplateDirectoryW,NewDirectoryW,lpSecurityAttributes);
|
return CreateDirectoryExW(TemplateDirectoryW,
|
||||||
|
NewDirectoryW,
|
||||||
|
lpSecurityAttributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WINBOOL
|
WINBOOL STDCALL CreateDirectoryW(LPCWSTR lpPathName,
|
||||||
STDCALL
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
|
||||||
CreateDirectoryW(
|
|
||||||
LPCWSTR lpPathName,
|
|
||||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
return CreateDirectoryExW(NULL,lpPathName,lpSecurityAttributes);
|
return CreateDirectoryExW(NULL,lpPathName,lpSecurityAttributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
WINBOOL
|
WINBOOL STDCALL CreateDirectoryExW(LPCWSTR lpTemplateDirectory,
|
||||||
STDCALL
|
|
||||||
CreateDirectoryExW(
|
|
||||||
LPCWSTR lpTemplateDirectory,
|
|
||||||
LPCWSTR lpNewDirectory,
|
LPCWSTR lpNewDirectory,
|
||||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
NTSTATUS errCode;
|
NTSTATUS errCode;
|
||||||
HANDLE DirectoryHandle;
|
HANDLE DirectoryHandle;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
UNICODE_STRING DirectoryNameString;
|
UNICODE_STRING DirectoryNameString;
|
||||||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
|
||||||
if ( lpTemplateDirectory != NULL ) {
|
if ( lpTemplateDirectory != NULL )
|
||||||
|
{
|
||||||
// get object attributes from template directory
|
// get object attributes from template directory
|
||||||
|
DPRINT("KERNEL32:FIXME:%s:%d\n",__FILE__,__LINE__);
|
||||||
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DirectoryNameString.Length = lstrlenW(lpNewDirectory)*sizeof(WCHAR);
|
DirectoryNameString.Length = lstrlenW(lpNewDirectory)*sizeof(WCHAR);
|
||||||
DirectoryNameString.Buffer = (WCHAR *)lpNewDirectory;
|
DirectoryNameString.Buffer = (WCHAR *)lpNewDirectory;
|
||||||
DirectoryNameString.MaximumLength = DirectoryNameString.Length+sizeof(WCHAR);
|
DirectoryNameString.MaximumLength = DirectoryNameString.Length+sizeof(WCHAR);
|
||||||
|
@ -92,26 +95,32 @@ CreateDirectoryExW(
|
||||||
ObjectAttributes.SecurityDescriptor = NULL;
|
ObjectAttributes.SecurityDescriptor = NULL;
|
||||||
ObjectAttributes.SecurityQualityOfService = NULL;
|
ObjectAttributes.SecurityQualityOfService = NULL;
|
||||||
|
|
||||||
|
errCode = ZwCreateFile(&DirectoryHandle,
|
||||||
|
DIRECTORY_ALL_ACCESS,
|
||||||
|
&ObjectAttributes,
|
||||||
|
&IoStatusBlock,
|
||||||
|
NULL,
|
||||||
|
FILE_ATTRIBUTE_DIRECTORY,
|
||||||
|
0,
|
||||||
|
FILE_CREATE,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
|
||||||
errCode = NtCreateDirectoryObject(
|
if (!NT_SUCCESS(errCode))
|
||||||
&DirectoryHandle,
|
{
|
||||||
GENERIC_ALL,
|
|
||||||
&ObjectAttributes
|
|
||||||
);
|
|
||||||
if (!NT_SUCCESS(errCode) ) {
|
|
||||||
SetLastError(RtlNtStatusToDosError(errCode));
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NtClose(DirectoryHandle);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WINBOOL
|
WINBOOL STDCALL RemoveDirectoryA(LPCSTR lpPathName)
|
||||||
STDCALL
|
|
||||||
RemoveDirectoryA(
|
|
||||||
LPCSTR lpPathName
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
WCHAR PathNameW[MAX_PATH];
|
WCHAR PathNameW[MAX_PATH];
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
@ -127,11 +136,7 @@ RemoveDirectoryA(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WINBOOL
|
WINBOOL STDCALL RemoveDirectoryW(LPCWSTR lpPathName)
|
||||||
STDCALL
|
|
||||||
RemoveDirectoryW(
|
|
||||||
LPCWSTR lpPathName
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
NTSTATUS errCode;
|
NTSTATUS errCode;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
@ -148,24 +153,20 @@ RemoveDirectoryW(
|
||||||
ObjectAttributes.SecurityDescriptor = NULL;
|
ObjectAttributes.SecurityDescriptor = NULL;
|
||||||
ObjectAttributes.SecurityQualityOfService = NULL;
|
ObjectAttributes.SecurityQualityOfService = NULL;
|
||||||
|
|
||||||
errCode = NtDeleteFile(
|
errCode = NtDeleteFile(&ObjectAttributes);
|
||||||
&ObjectAttributes
|
|
||||||
);
|
if (!NT_SUCCESS(errCode))
|
||||||
if (!NT_SUCCESS(errCode) ) {
|
{
|
||||||
SetLastError(RtlNtStatusToDosError(errCode));
|
SetLastError(RtlNtStatusToDosError(errCode));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD
|
DWORD STDCALL GetFullPathNameA(LPCSTR lpFileName,
|
||||||
STDCALL
|
|
||||||
GetFullPathNameA(
|
|
||||||
LPCSTR lpFileName,
|
|
||||||
DWORD nBufferLength,
|
DWORD nBufferLength,
|
||||||
LPSTR lpBuffer,
|
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),
|
&(IData->PatternStr),
|
||||||
FALSE);
|
FALSE);
|
||||||
DPRINT("Found %w\n",IData->FileInfo.FileName);
|
DPRINT("Found %w\n",IData->FileInfo.FileName);
|
||||||
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
|
|
||||||
if (Status != STATUS_SUCCESS)
|
if (Status != STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FileDataToWin32Data(lpFindFileData, IData);
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static FileDataToWin32Data(LPWIN32_FIND_DATA lpFindFileData
|
static FileDataToWin32Data(LPWIN32_FIND_DATA lpFindFileData, PKERNEL32_FIND_FILE_DATA IData)
|
||||||
,PKERNEL32_FIND_FILE_DATA IData)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
|
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
|
||||||
|
@ -96,16 +97,7 @@ static FileDataToWin32Data(LPWIN32_FIND_DATA lpFindFileData
|
||||||
// memcpy(&lpFindFileData->ftLastWriteTime,&IData->FileInfo.LastWriteTime,sizeof(FILETIME));
|
// memcpy(&lpFindFileData->ftLastWriteTime,&IData->FileInfo.LastWriteTime,sizeof(FILETIME));
|
||||||
lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile>>32;
|
lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile>>32;
|
||||||
lpFindFileData->nFileSizeLow = IData->FileInfo.EndOfFile;
|
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,
|
HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName,
|
||||||
|
@ -180,6 +172,7 @@ HANDLE STDCALL InternalFindFirstFile(LPCWSTR lpFileName,
|
||||||
FALSE);
|
FALSE);
|
||||||
DPRINT("Found %w\n",IData->FileInfo.FileName);
|
DPRINT("Found %w\n",IData->FileInfo.FileName);
|
||||||
|
|
||||||
|
FileDataToWin32Data(lpFindFileData, IData);
|
||||||
|
|
||||||
return(IData);
|
return(IData);
|
||||||
}
|
}
|
||||||
|
@ -203,9 +196,31 @@ HANDLE FindFirstFileA(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData)
|
||||||
if (IData == NULL)
|
if (IData == NULL)
|
||||||
{
|
{
|
||||||
DPRINT("Failing request\n");
|
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);
|
return(IData);
|
||||||
|
@ -224,11 +239,28 @@ WINBOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
|
||||||
}
|
}
|
||||||
if (!InternalFindNextFile(hFindFile, lpFindFileData))
|
if (!InternalFindNextFile(hFindFile, lpFindFileData))
|
||||||
{
|
{
|
||||||
|
DPRINT("InternalFindNextFile() failed\n");
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData;
|
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);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,7 +268,7 @@ BOOL FindClose(HANDLE hFindFile)
|
||||||
{
|
{
|
||||||
PKERNEL32_FIND_FILE_DATA IData;
|
PKERNEL32_FIND_FILE_DATA IData;
|
||||||
|
|
||||||
dprintf("FindClose(hFindFile %x)\n",hFindFile);
|
DPRINT("FindClose(hFindFile %x)\n",hFindFile);
|
||||||
|
|
||||||
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
|
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
|
||||||
NtClose(IData->DirectoryHandle);
|
NtClose(IData->DirectoryHandle);
|
||||||
|
@ -253,17 +285,12 @@ HANDLE STDCALL FindFirstFileW(LPCWSTR lpFileName,
|
||||||
|
|
||||||
IData = InternalFindFirstFile(lpFileName,lpFindFileData);
|
IData = InternalFindFirstFile(lpFileName,lpFindFileData);
|
||||||
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData;
|
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData;
|
||||||
FileDataToWin32Data(lpFindFileData,IData);
|
|
||||||
|
|
||||||
for (i=0; i<IData->FileInfo.FileNameLength; i++)
|
memcpy(Ret->cFileName, IData->FileInfo.FileName,
|
||||||
{
|
IData->FileInfo.FileNameLength);
|
||||||
Ret->cFileName[i] = IData->FileInfo.FileName[i];
|
memset(Ret->cAlternateFileName, IData->FileInfo.ShortName,
|
||||||
}
|
IData->FileInfo.ShortNameLength);
|
||||||
Ret->cFileName[i] = 0;
|
|
||||||
for(i=0;i<IData->FileInfo.ShortNameLength;i++)
|
|
||||||
{
|
|
||||||
Ret->cAlternateFileName[i] = IData->FileInfo.ShortName[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return(IData);
|
return(IData);
|
||||||
}
|
}
|
||||||
|
@ -282,17 +309,11 @@ WINBOOL STDCALL FindNextFileW(HANDLE hFindFile,
|
||||||
}
|
}
|
||||||
|
|
||||||
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData;
|
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData;
|
||||||
FileDataToWin32Data(lpFindFileData,IData);
|
|
||||||
|
|
||||||
for (i=0; i<IData->FileInfo.FileNameLength; i++)
|
memcpy(Ret->cFileName, IData->FileInfo.FileName,
|
||||||
{
|
IData->FileInfo.FileNameLength);
|
||||||
Ret->cFileName[i] = IData->FileInfo.FileName[i];
|
memcpy(Ret->cAlternateFileName, IData->FileInfo.ShortName,
|
||||||
}
|
IData->FileInfo.ShortNameLength);
|
||||||
Ret->cFileName[i] = 0;
|
|
||||||
for(i=0;i<IData->FileInfo.ShortNameLength;i++)
|
|
||||||
{
|
|
||||||
Ret->cAlternateFileName[i] = IData->FileInfo.ShortName[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ LOADERS = dos
|
||||||
# Select the device drivers and filesystems you want
|
# Select the device drivers and filesystems you want
|
||||||
#
|
#
|
||||||
KERNEL_SERVICES = parallel keyboard blues null mouse serial sound ide test sdisk \
|
KERNEL_SERVICES = parallel keyboard blues null mouse serial sound ide test sdisk \
|
||||||
minix vfat # ext2fs
|
minix vfat ext2
|
||||||
|
|
||||||
APPS = hello shell
|
APPS = hello shell
|
||||||
|
|
||||||
|
@ -107,8 +107,8 @@ serial: dummy
|
||||||
sound: dummy
|
sound: dummy
|
||||||
make -C services/dd/sound
|
make -C services/dd/sound
|
||||||
|
|
||||||
ext2fs: dummy
|
ext2: dummy
|
||||||
make -C services/fs/ext2fs
|
make -C services/fs/ext2
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kernel loaders
|
# Kernel loaders
|
||||||
|
|
|
@ -292,8 +292,10 @@ DPRINT("StartingOffset:%ld:%ld\n",
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Read.ByteOffset, 0);
|
SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Read.ByteOffset,
|
||||||
SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Read.ByteOffset, 0);
|
0);
|
||||||
|
SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Read.ByteOffset,
|
||||||
|
0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -304,8 +306,10 @@ DPRINT("StartingOffset:%ld:%ld\n",
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Write.ByteOffset, 0);
|
SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Write.ByteOffset,
|
||||||
SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Write.ByteOffset, 0);
|
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);
|
DPRINT("FileObject %x\n",FileObject);
|
||||||
|
|
||||||
if (DeviceObject->Flags & DO_BUFFERED_IO &&
|
if (DeviceObject->Flags & DO_BUFFERED_IO)
|
||||||
IoStack->MajorFunction == IRP_MJ_READ)
|
{
|
||||||
|
if (IoStack->MajorFunction == IRP_MJ_READ)
|
||||||
{
|
{
|
||||||
DPRINT("Copying buffered io back to user\n");
|
DPRINT("Copying buffered io back to user\n");
|
||||||
memcpy(Irp->UserBuffer,Irp->AssociatedIrp.SystemBuffer,
|
memcpy(Irp->UserBuffer,Irp->AssociatedIrp.SystemBuffer,
|
||||||
IoStack->Parameters.Read.Length);
|
IoStack->Parameters.Read.Length);
|
||||||
|
}
|
||||||
ExFreePool(Irp->AssociatedIrp.SystemBuffer);
|
ExFreePool(Irp->AssociatedIrp.SystemBuffer);
|
||||||
}
|
}
|
||||||
if (DeviceObject->Flags & DO_DIRECT_IO)
|
if (DeviceObject->Flags & DO_DIRECT_IO)
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include <internal/string.h>
|
#include <internal/string.h>
|
||||||
#include <wstring.h>
|
#include <wstring.h>
|
||||||
|
|
||||||
//#define NDEBUG
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
/* FUNCTIONS *************************************************************/
|
/* FUNCTIONS *************************************************************/
|
||||||
|
|
|
@ -197,7 +197,8 @@ PIRP IoAllocateIrp(CCHAR StackSize, BOOLEAN ChargeQuota)
|
||||||
DPRINT("IoAllocateIrp(StackSize %d ChargeQuota %d)\n",
|
DPRINT("IoAllocateIrp(StackSize %d ChargeQuota %d)\n",
|
||||||
StackSize,
|
StackSize,
|
||||||
ChargeQuota);
|
ChargeQuota);
|
||||||
if (ChargeQuota)
|
// if (ChargeQuota)
|
||||||
|
if (0)
|
||||||
{
|
{
|
||||||
Irp = ExAllocatePoolWithQuota(NonPagedPool,IoSizeOfIrp(StackSize));
|
Irp = ExAllocatePoolWithQuota(NonPagedPool,IoSizeOfIrp(StackSize));
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,16 +95,6 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
|
||||||
|
|
||||||
StackPtr = IoGetNextIrpStackLocation(Irp);
|
StackPtr = IoGetNextIrpStackLocation(Irp);
|
||||||
StackPtr->FileObject = FileObject;
|
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)
|
if (Key!=NULL)
|
||||||
{
|
{
|
||||||
StackPtr->Parameters.Read.Key = *Key;
|
StackPtr->Parameters.Read.Key = *Key;
|
||||||
|
@ -114,7 +104,6 @@ NTSTATUS ZwReadFile(HANDLE FileHandle,
|
||||||
StackPtr->Parameters.Read.Key = 0;
|
StackPtr->Parameters.Read.Key = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject);
|
|
||||||
Status = IoCallDriver(FileObject->DeviceObject,Irp);
|
Status = IoCallDriver(FileObject->DeviceObject,Irp);
|
||||||
if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
|
if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/mm/pool.c
|
* FILE: ntoskrnl/mm/pool.c
|
||||||
* PURPOSE: Implements the kernel memory pool
|
* PURPOSE: Implements the kernel memory pool
|
||||||
* PROGRAMMER: David Welch (welch@mcmail.com)
|
* PROGRAMMER: David Welch (welch@cwcom.net)
|
||||||
* UPDATE HISTORY:
|
* UPDATE HISTORY:
|
||||||
* 27/05/98: Created
|
* 27/05/98: Created
|
||||||
* 10/06/98: Bug fixes by Iwan Fatahi (i_fatahi@hotmail.com)
|
* 10/06/98: Bug fixes by Iwan Fatahi (i_fatahi@hotmail.com)
|
||||||
|
@ -34,6 +34,12 @@
|
||||||
#define VALIDATE_POOL
|
#define VALIDATE_POOL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define POOL_TRACE(args...) do { DbgPrint(args); } while(0);
|
||||||
|
#else
|
||||||
|
#define POOL_TRACE(args...)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* TYPES *******************************************************************/
|
/* TYPES *******************************************************************/
|
||||||
|
|
||||||
#define BLOCK_HDR_MAGIC (0xdeadbeef)
|
#define BLOCK_HDR_MAGIC (0xdeadbeef)
|
||||||
|
@ -534,8 +540,8 @@ asmlinkage VOID ExFreePool(PVOID block)
|
||||||
block_hdr* blk=address_to_block(block);
|
block_hdr* blk=address_to_block(block);
|
||||||
OLD_DPRINT("(%s:%d) freeing block %x\n",__FILE__,__LINE__,blk);
|
OLD_DPRINT("(%s:%d) freeing block %x\n",__FILE__,__LINE__,blk);
|
||||||
|
|
||||||
// DbgPrint("ExFreePool(block %x), size %d, caller %x\n",block,blk->size,
|
POOL_TRACE("ExFreePool(block %x), size %d, caller %x\n",block,blk->size,
|
||||||
// ((PULONG)&block)[-1]);
|
((PULONG)&block)[-1]);
|
||||||
|
|
||||||
VALIDATE_POOL;
|
VALIDATE_POOL;
|
||||||
|
|
||||||
|
@ -596,10 +602,16 @@ static void defrag_free_list(void)
|
||||||
DPRINT("Finish To defrag free blocks,max=%d\n",max);
|
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;
|
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 free list %d\n",nr_free_blocks);
|
||||||
// DbgPrint("Blocks on used list %d\n",eiNrUsedblocks);
|
// DbgPrint("Blocks on used list %d\n",eiNrUsedblocks);
|
||||||
|
@ -611,6 +623,7 @@ PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag)
|
||||||
*/
|
*/
|
||||||
if (size==0)
|
if (size==0)
|
||||||
{
|
{
|
||||||
|
POOL_TRACE("= NULL\n");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,10 +648,12 @@ PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag)
|
||||||
block=take_block(current,size);
|
block=take_block(current,size);
|
||||||
VALIDATE_POOL;
|
VALIDATE_POOL;
|
||||||
memset(block,0,size);
|
memset(block,0,size);
|
||||||
|
POOL_TRACE("= %x\n",block);
|
||||||
return(block);
|
return(block);
|
||||||
}
|
}
|
||||||
current=current->next;
|
current=current->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(EiFreeNonPagedPool>size+32*PAGESIZE)
|
if(EiFreeNonPagedPool>size+32*PAGESIZE)
|
||||||
{//try defrag free list before growing kernel pool
|
{//try defrag free list before growing kernel pool
|
||||||
defrag_free_list();
|
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);
|
OLD_DPRINT("found block %x of size %d\n",current,size);
|
||||||
block=take_block(current,size);
|
block=take_block(current,size);
|
||||||
memset(block,0,size);
|
memset(block,0,size);
|
||||||
|
POOL_TRACE("= %x\n",block);
|
||||||
return(block);
|
return(block);
|
||||||
}
|
}
|
||||||
current=current->next;
|
current=current->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Otherwise create a new block
|
* Otherwise create a new block
|
||||||
*/
|
*/
|
||||||
block=block_to_address(grow_kernel_pool(size));
|
block=block_to_address(grow_kernel_pool(size));
|
||||||
VALIDATE_POOL;
|
VALIDATE_POOL;
|
||||||
memset(block,0,size);
|
memset(block,0,size);
|
||||||
|
POOL_TRACE("= %x\n",block);
|
||||||
return(block);
|
return(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,43 +45,46 @@ PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes)
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
PVOID Block;
|
PVOID Block;
|
||||||
// DbgPrint("ExAllocatePool(NumberOfBytes %d) caller %x\n",
|
Block = ExAllocateNonPagedPoolWithTag(PoolType,
|
||||||
// NumberOfBytes,((PULONG)&PoolType)[-1]);
|
NumberOfBytes,
|
||||||
Block = ExAllocatePoolWithTag(PoolType,NumberOfBytes,TAG_NONE);
|
TAG_NONE,
|
||||||
// DbgPrint("ExAllocatePool() = %x\n",Block);
|
(&PoolType)[-1]);
|
||||||
return(Block);
|
return(Block);
|
||||||
}
|
}
|
||||||
|
|
||||||
PVOID ExAllocatePoolWithTag(ULONG type, ULONG size, ULONG Tag)
|
PVOID ExAllocatePoolWithTag(ULONG PoolType, ULONG NumberOfBytes, ULONG Tag)
|
||||||
{
|
{
|
||||||
PVOID Block;
|
PVOID Block;
|
||||||
|
|
||||||
if (type == NonPagedPoolCacheAligned ||
|
if (PoolType == NonPagedPoolCacheAligned ||
|
||||||
type == NonPagedPoolCacheAlignedMustS)
|
PoolType == NonPagedPoolCacheAlignedMustS)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(type)
|
switch(PoolType)
|
||||||
{
|
{
|
||||||
case NonPagedPool:
|
case NonPagedPool:
|
||||||
case NonPagedPoolMustSucceed:
|
case NonPagedPoolMustSucceed:
|
||||||
case NonPagedPoolCacheAligned:
|
case NonPagedPoolCacheAligned:
|
||||||
case NonPagedPoolCacheAlignedMustS:
|
case NonPagedPoolCacheAlignedMustS:
|
||||||
Block = ExAllocateNonPagedPoolWithTag(type,size,Tag);
|
Block = ExAllocateNonPagedPoolWithTag(PoolType,
|
||||||
|
NumberOfBytes,
|
||||||
|
Tag,
|
||||||
|
(&PoolType)[-1]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PagedPool:
|
case PagedPool:
|
||||||
case PagedPoolCacheAligned:
|
case PagedPoolCacheAligned:
|
||||||
Block = ExAllocatePagedPoolWithTag(type,size,Tag);
|
Block = ExAllocatePagedPoolWithTag(PoolType,NumberOfBytes,Tag);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return(NULL);
|
return(NULL);
|
||||||
};
|
};
|
||||||
|
|
||||||
if ((type==NonPagedPoolMustSucceed || type==NonPagedPoolCacheAlignedMustS)
|
if ((PoolType==NonPagedPoolMustSucceed ||
|
||||||
&& Block==NULL)
|
PoolType==NonPagedPoolCacheAlignedMustS) && Block==NULL)
|
||||||
{
|
{
|
||||||
KeBugCheck(MUST_SUCCEED_POOL_EMPTY);
|
KeBugCheck(MUST_SUCCEED_POOL_EMPTY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,6 +120,12 @@ NTSTATUS STDCALL ZwTerminateThread(IN HANDLE ThreadHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID PsReleaseThread(PETHREAD Thread)
|
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);
|
DPRINT("PsReleaseThread(Thread %x)\n",Thread);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue