Blame src/fs/ntapi_tt_get_file_handle_type.c

dd89bb
/********************************************************/
dd89bb
/*  ntapi: Native API core library                      */
59d585
/*  Copyright (C) 2013--2021  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
}