?? ulib.cxx
字號(hào):
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( BDSTRING ) &&
#endif
DEFINE_CLASS_DESCRIPTOR( BITVECTOR ) &&
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( BYTE_STREAM ) &&
DEFINE_CLASS_DESCRIPTOR( CHKDSK_MESSAGE ) &&
DEFINE_CLASS_DESCRIPTOR( COMM_DEVICE ) &&
#endif
DEFINE_CLASS_DESCRIPTOR( CONTAINER ) &&
DEFINE_CLASS_DESCRIPTOR( DSTRING ) &&
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( FLAG_ARGUMENT ) &&
DEFINE_CLASS_DESCRIPTOR( FSNODE ) &&
DEFINE_CLASS_DESCRIPTOR( FSN_DIRECTORY ) &&
DEFINE_CLASS_DESCRIPTOR( FSN_FILE ) &&
DEFINE_CLASS_DESCRIPTOR( FSN_FILTER ) &&
#endif
DEFINE_CLASS_DESCRIPTOR( ITERATOR ) &&
DEFINE_CLASS_DESCRIPTOR( LIST ) &&
DEFINE_CLASS_DESCRIPTOR( LIST_ITERATOR ) &&
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( LONG_ARGUMENT ) &&
DEFINE_CLASS_DESCRIPTOR( MULTIPLE_PATH_ARGUMENT ) &&
DEFINE_CLASS_DESCRIPTOR( PATH ) &&
DEFINE_CLASS_DESCRIPTOR( PATH_ARGUMENT ) &&
DEFINE_CLASS_DESCRIPTOR( PROGRAM ) &&
#endif
DEFINE_CLASS_DESCRIPTOR( SEQUENTIAL_CONTAINER ) &&
DEFINE_CLASS_DESCRIPTOR( SORTABLE_CONTAINER ) &&
DEFINE_CLASS_DESCRIPTOR( SORTED_LIST ) &&
DEFINE_CLASS_DESCRIPTOR( SORTED_LIST_ITERATOR ) &&
DEFINE_CLASS_DESCRIPTOR( WSTRING ) &&
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( BSTRING ) &&
DEFINE_CLASS_DESCRIPTOR( STRING_ARGUMENT ) &&
DEFINE_CLASS_DESCRIPTOR( STRING_ARRAY ) &&
DEFINE_CLASS_DESCRIPTOR( TIMEINFO ) &&
DEFINE_CLASS_DESCRIPTOR( TIMEINFO_ARGUMENT ) &&
#endif
DEFINE_CLASS_DESCRIPTOR( MESSAGE ) &&
TRUE ) {
} else {
Success = FALSE;
}
if (Success &&
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( BUFFER_STREAM ) &&
#endif
DEFINE_CLASS_DESCRIPTOR( CONT_MEM ) &&
TRUE ) {
} else {
Success = FALSE;
}
if (Success &&
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( FILE_STREAM ) &&
#endif
DEFINE_CLASS_DESCRIPTOR( FSTRING ) &&
DEFINE_CLASS_DESCRIPTOR( HMEM ) &&
DEFINE_CLASS_DESCRIPTOR( STATIC_MEM_BLOCK_MGR ) &&
DEFINE_CLASS_DESCRIPTOR( MEM_BLOCK_MGR ) &&
TRUE ) {
} else {
Success = FALSE;
}
if (Success &&
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( KEYBOARD ) &&
#endif
DEFINE_CLASS_DESCRIPTOR( MEM ) &&
#ifndef _EFICHECK_
DEFINE_CLASS_DESCRIPTOR( PIPE ) &&
DEFINE_CLASS_DESCRIPTOR( PIPE_STREAM ) &&
DEFINE_CLASS_DESCRIPTOR( PRINT_STREAM ) &&
DEFINE_CLASS_DESCRIPTOR( REST_OF_LINE_ARGUMENT ) &&
DEFINE_CLASS_DESCRIPTOR( SCREEN ) &&
DEFINE_CLASS_DESCRIPTOR( STREAM ) &&
DEFINE_CLASS_DESCRIPTOR( STREAM_MESSAGE ) &&
#endif
#if defined( _AUTOCHECK_ )
DEFINE_CLASS_DESCRIPTOR( AUTOCHECK_MESSAGE ) &&
DEFINE_CLASS_DESCRIPTOR( TM_AUTOCHECK_MESSAGE ) &&
#endif // _AUTOCHECK_
#if defined( _EFICHECK_ )
DEFINE_CLASS_DESCRIPTOR( EFICHECK_MESSAGE ) &&
#endif
TRUE ) {
} else {
Success = FALSE;
}
if (!Success) {
DebugPrint( "Could not initialize class descriptors!");
}
return Success;
}
STATIC
BOOLEAN
UndefineClassDescriptors (
)
/*++
Routine Description:
Defines all the class descriptors used by ULIB
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if all class descriptors were succesfully
constructed and initialized.
--*/
{
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( ARGUMENT );
UNDEFINE_CLASS_DESCRIPTOR( ARGUMENT_LEXEMIZER );
#endif
UNDEFINE_CLASS_DESCRIPTOR( ARRAY );
UNDEFINE_CLASS_DESCRIPTOR( ARRAY_ITERATOR );
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( BDSTRING );
#endif
UNDEFINE_CLASS_DESCRIPTOR( BITVECTOR );
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( BYTE_STREAM );
UNDEFINE_CLASS_DESCRIPTOR( CHKDSK_MESSAGE );
UNDEFINE_CLASS_DESCRIPTOR( COMM_DEVICE );
#endif
UNDEFINE_CLASS_DESCRIPTOR( CONTAINER );
UNDEFINE_CLASS_DESCRIPTOR( DSTRING );
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( FLAG_ARGUMENT );
UNDEFINE_CLASS_DESCRIPTOR( FSNODE );
UNDEFINE_CLASS_DESCRIPTOR( FSN_DIRECTORY );
UNDEFINE_CLASS_DESCRIPTOR( FSN_FILE );
UNDEFINE_CLASS_DESCRIPTOR( FSN_FILTER );
#endif
UNDEFINE_CLASS_DESCRIPTOR( ITERATOR );
UNDEFINE_CLASS_DESCRIPTOR( LIST );
UNDEFINE_CLASS_DESCRIPTOR( LIST_ITERATOR );
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( LONG_ARGUMENT );
UNDEFINE_CLASS_DESCRIPTOR( MULTIPLE_PATH_ARGUMENT );
UNDEFINE_CLASS_DESCRIPTOR( PATH );
UNDEFINE_CLASS_DESCRIPTOR( PATH_ARGUMENT );
UNDEFINE_CLASS_DESCRIPTOR( PROGRAM );
#endif
UNDEFINE_CLASS_DESCRIPTOR( SEQUENTIAL_CONTAINER );
UNDEFINE_CLASS_DESCRIPTOR( SORTABLE_CONTAINER );
UNDEFINE_CLASS_DESCRIPTOR( SORTED_LIST );
UNDEFINE_CLASS_DESCRIPTOR( SORTED_LIST_ITERATOR );
UNDEFINE_CLASS_DESCRIPTOR( WSTRING );
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( BSTRING );
UNDEFINE_CLASS_DESCRIPTOR( STRING_ARGUMENT );
UNDEFINE_CLASS_DESCRIPTOR( STRING_ARRAY );
UNDEFINE_CLASS_DESCRIPTOR( TIMEINFO );
UNDEFINE_CLASS_DESCRIPTOR( TIMEINFO_ARGUMENT );
#endif
UNDEFINE_CLASS_DESCRIPTOR( MESSAGE );
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( BUFFER_STREAM );
#endif
UNDEFINE_CLASS_DESCRIPTOR( CONT_MEM );
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( FILE_STREAM );
#endif
UNDEFINE_CLASS_DESCRIPTOR( FSTRING );
UNDEFINE_CLASS_DESCRIPTOR( HMEM );
UNDEFINE_CLASS_DESCRIPTOR( STATIC_MEM_BLOCK_MGR );
UNDEFINE_CLASS_DESCRIPTOR( MEM_BLOCK_MGR );
UNDEFINE_CLASS_DESCRIPTOR( MEM );
#ifndef _EFICHECK_
UNDEFINE_CLASS_DESCRIPTOR( KEYBOARD );
UNDEFINE_CLASS_DESCRIPTOR( PIPE );
UNDEFINE_CLASS_DESCRIPTOR( PIPE_STREAM );
UNDEFINE_CLASS_DESCRIPTOR( PRINT_STREAM );
UNDEFINE_CLASS_DESCRIPTOR( REST_OF_LINE_ARGUMENT );
UNDEFINE_CLASS_DESCRIPTOR( SCREEN );
UNDEFINE_CLASS_DESCRIPTOR( STREAM );
UNDEFINE_CLASS_DESCRIPTOR( STREAM_MESSAGE );
#endif
#if defined( _AUTOCHECK_ )
UNDEFINE_CLASS_DESCRIPTOR( AUTOCHECK_MESSAGE );
UNDEFINE_CLASS_DESCRIPTOR( TM_AUTOCHECK_MESSAGE );
#endif // _AUTOCHECK_
#if defined( _EFICHECK_ )
UNDEFINE_CLASS_DESCRIPTOR( EFICHECK_MESSAGE );
#endif
return TRUE;
}
#if !defined( _AUTOCHECK_ ) && !defined( _SETUP_LOADER_ ) && !defined( _EFICHECK_ )
BOOLEAN
CreateStandardStreams (
)
/*++
Routine Description:
Creates the standard streams
Arguments:
None.
Return Value:
TRUE if the streams were successfully created,
FALSE otherwise
--*/
{
Standard_Input_Stream = GetStandardStream( GetStdHandle( STD_INPUT_HANDLE),
READ_ACCESS );
Standard_Output_Stream = GetStandardStream( GetStdHandle( STD_OUTPUT_HANDLE),
WRITE_ACCESS );
Standard_Error_Stream = GetStandardStream( GetStdHandle( STD_ERROR_HANDLE),
WRITE_ACCESS );
return ( (Standard_Input_Stream != NULL) &&
(Standard_Output_Stream != NULL) &&
(Standard_Error_Stream != NULL) );
}
PSTREAM
GetStandardStream (
IN HANDLE Handle,
IN STREAMACCESS Access
)
/*++
Routine Description:
Creates a standard stream out of a standard handle
Arguments:
Handle - Supplies the standard handle
Access - Supplies the access.
Return Value:
Pointer to the stream object created.
--*/
{
PSTREAM Stream = NULL;
PFILE_STREAM FileStream;
PPIPE_STREAM PipeStream;
PKEYBOARD Keyboard;
PSCREEN Screen;
switch ( GetFileType( Handle ) ) {
case (DWORD)FILE_TYPE_DISK:
if ((FileStream = NEW FILE_STREAM) != NULL ) {
if ( !FileStream->Initialize( Handle, Access ) ) {
DELETE( FileStream );
}
Stream = (PSTREAM)FileStream;
}
break;
case (DWORD)FILE_TYPE_CHAR:
//
// BUGBUG this type refers to all character devices, not
// just the console. I will add some hacks to see if
// the handle refers to the console or not. This
// information should be given in a clean way by the
// API (talk with MarkL)
//
switch ( Access ) {
case READ_ACCESS:
//
// BUGBUG Jaimes See if this is a console handle
//
{
DWORD Mode;
if (!GetConsoleMode( Handle, &Mode )) {
//
// This is not a console, but some other character
// device. Create a pipe stream for it.
//
if ((PipeStream = NEW PIPE_STREAM) != NULL ) {
if ( !PipeStream->Initialize( Handle, Access ) ) {
DELETE( PipeStream );
}
Stream = (PSTREAM)PipeStream;
}
break;
}
}
if ((Keyboard = NEW KEYBOARD) != NULL ) {
if ( !Keyboard->Initialize() ) {
DELETE( Keyboard );
}
Stream = (PSTREAM)Keyboard;
}
break;
case WRITE_ACCESS:
//
// BUGBUG See if this is a console handle
//
{
DWORD Mode;
if (!GetConsoleMode( Handle, &Mode )) {
//
// This is not a console, but some other character
// device. Create a file stream for it.
//
if ((FileStream = NEW FILE_STREAM) != NULL ) {
if ( !FileStream->Initialize( Handle, Access ) ) {
DELETE( FileStream );
}
Stream = (PSTREAM)FileStream;
}
break;
}
}
if ((Screen = NEW SCREEN) != NULL ) {
if ( !Screen->Initialize() ) {
DELETE( Screen );
}
Stream = (PSTREAM)Screen;
}
break;
default:
break;
}
break;
case (DWORD)FILE_TYPE_PIPE:
if ((PipeStream = NEW PIPE_STREAM) != NULL ) {
if ( !PipeStream->Initialize( Handle, Access ) ) {
DELETE( PipeStream );
}
Stream = (PSTREAM)PipeStream;
}
break;
case (DWORD)FILE_TYPE_UNKNOWN:
// Probably a windows app. Don't print anything to debug.
break;
default:
DebugPrintTrace(("ERROR: FileType for standard stream %lx is invalid (%lx)\n", Handle, GetFileType(Handle)));
break;
}
return Stream;
}
NONVIRTUAL
ULIB_EXPORT
HANDLE
FindFirstFile (
IN PCPATH Path,
OUT PWIN32_FIND_DATA FileFindData
)
/*++
Routine Description:
Perform a FindFirst file given a PATH rather tha a PSTR.
Arguments:
Path - Supplies a pointer to the PATH to search.
FileFindData - Supplies a pointer where the results of the find is
returned.
Return Value:
HANDLE - Returns the results of the call to the Win32 FindFirstFile API.
--*/
{
PWSTR p;
//
// If the supplied pointers are non-NULL and an OEM representation
// (i.e. API ready) of the PATH is available, return the
// HANDLE returned by the Win32 FindFirstFile API
//
DebugPtrAssert( Path );
DebugPtrAssert( FileFindData );
if (!Path || !FileFindData) {
return INVALID_HANDLE_VALUE;
}
p = (PWSTR) Path->GetPathString()->GetWSTR();
if (!p) {
return INVALID_HANDLE_VALUE;
}
return FindFirstFile(p, FileFindData);
}
#endif // _AUTOCHECK_ || _SETUP_LOADER_
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -