|
|
dd89bb |
/********************************************************/
|
|
|
dd89bb |
/* ntapi: Native API core library */
|
|
|
dd89bb |
/* Copyright (C) 2013,2014,2015 Z. Gilboa */
|
|
|
dd89bb |
/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */
|
|
|
dd89bb |
/********************************************************/
|
|
|
dd89bb |
|
|
|
dd89bb |
#include <ntapi/ntapi.h>
|
|
|
dd89bb |
#include <ntapi/nt_file.h>
|
|
|
dd89bb |
#include "ntapi_impl.h"
|
|
|
dd89bb |
|
|
|
dd89bb |
typedef int __stdcall winapi_get_console_mode(void * handle, uint32_t * mode);
|
|
|
dd89bb |
|
|
|
dd89bb |
int32_t __stdcall __ntapi_tt_get_file_handle_type(
|
|
|
dd89bb |
__in void * handle,
|
|
|
dd89bb |
__out int32_t * type)
|
|
|
dd89bb |
{
|
|
|
dd89bb |
int32_t status;
|
|
|
dd89bb |
uint32_t info;
|
|
|
dd89bb |
nt_iosb iosb;
|
|
|
dd89bb |
nt_fsssi fsssi;
|
|
|
dd89bb |
nt_file_directory_information fdi;
|
|
|
dd89bb |
nt_file_pipe_information fpi;
|
|
|
dd89bb |
nt_object_basic_information obi;
|
|
|
dd89bb |
|
|
|
dd89bb |
void * hkernel32;
|
|
|
dd89bb |
char str_get_con_mode[32] = "GetConsoleMode";
|
|
|
dd89bb |
winapi_get_console_mode * pfn_get_con_mode;
|
|
|
dd89bb |
|
|
|
dd89bb |
/* validation */
|
|
|
dd89bb |
if (!handle) return NT_STATUS_INVALID_HANDLE;
|
|
|
dd89bb |
|
|
|
dd89bb |
/* file-system directory? */
|
|
|
dd89bb |
if (!(status = __ntapi->zw_query_information_file(
|
|
|
dd89bb |
handle,
|
|
|
dd89bb |
&iosb,&fdi,sizeof(fdi),
|
|
|
dd89bb |
NT_FILE_DIRECTORY_INFORMATION))) {
|
|
|
dd89bb |
*type = NT_FILE_TYPE_DIRECTORY;
|
|
|
dd89bb |
return 0;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
/* file-system file? */
|
|
|
dd89bb |
if (!(status = __ntapi->zw_query_volume_information_file(
|
|
|
dd89bb |
handle,
|
|
|
dd89bb |
&iosb,&fsssi,sizeof(fsssi),
|
|
|
dd89bb |
NT_FILE_FS_SECTOR_SIZE_INFORMATION))) {
|
|
|
dd89bb |
*type = NT_FILE_TYPE_FILE;
|
|
|
dd89bb |
return 0;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
/* pipe? */
|
|
|
dd89bb |
if (!(status = __ntapi->zw_query_information_file(
|
|
|
dd89bb |
handle,
|
|
|
dd89bb |
&iosb,&fpi,sizeof(fpi),
|
|
|
dd89bb |
NT_FILE_PIPE_INFORMATION))) {
|
|
|
dd89bb |
*type = NT_FILE_TYPE_PIPE;
|
|
|
dd89bb |
return 0;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
/* csrss? */
|
|
|
dd89bb |
if (!(hkernel32 = pe_get_kernel32_module_handle()))
|
|
|
dd89bb |
return NT_STATUS_DLL_INIT_FAILED;
|
|
|
dd89bb |
else if (!(pfn_get_con_mode = (winapi_get_console_mode *)pe_get_procedure_address(
|
|
|
dd89bb |
hkernel32,str_get_con_mode)))
|
|
|
dd89bb |
return NT_STATUS_DLL_INIT_FAILED;
|
|
|
dd89bb |
|
|
|
dd89bb |
|
|
|
dd89bb |
/* (console functions return non-zero on success) */
|
|
|
dd89bb |
if ((pfn_get_con_mode(handle,&info))) {
|
|
|
dd89bb |
*type = NT_FILE_TYPE_CSRSS;
|
|
|
dd89bb |
return 0;
|
|
|
dd89bb |
}
|
|
|
dd89bb |
|
|
|
dd89bb |
/* invalid handle? */
|
|
|
dd89bb |
if ((status = __ntapi->zw_query_object(
|
|
|
dd89bb |
handle,NT_OBJECT_BASIC_INFORMATION,
|
|
|
dd89bb |
&obi,sizeof(obi),&info)))
|
|
|
dd89bb |
return status;
|
|
|
dd89bb |
|
|
|
dd89bb |
/* unknown object */
|
|
|
dd89bb |
*type = NT_FILE_TYPE_UNKNOWN;
|
|
|
dd89bb |
return NT_STATUS_SUCCESS;
|
|
|
dd89bb |
}
|