GetSymbolicLinkDeviceName
来源:互联网 发布:js done fail 编辑:程序博客网 时间:2024/06/06 02:58
#include <stdio.h>#include <Windows.h>//删除指针#define SafeFreeArraySize(pData) { if(pData){delete []pData;pData=NULL;} }#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)#define OBJ_CASE_INSENSITIVE 0x00000040L#define SYMBOLIC_LINK_QUERY (0x0001)typedef struct _UNICODE_STRING {USHORT Length;USHORT MaximumLength;PWSTR Buffer;} UNICODE_STRING;typedef UNICODE_STRING *PUNICODE_STRING;typedef const UNICODE_STRING *PCUNICODE_STRING;typedef struct _OBJECT_ATTRIBUTES {ULONG Length;HANDLE RootDirectory;PUNICODE_STRING ObjectName;ULONG Attributes;PVOID SecurityDescriptor;PVOID SecurityQualityOfService;} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES;#define InitializeObjectAttributes( p, n, a, r, s ) { \(p)->Length = sizeof( OBJECT_ATTRIBUTES ); \(p)->RootDirectory = r; \(p)->Attributes = a; \(p)->ObjectName = n; \(p)->SecurityDescriptor = s; \(p)->SecurityQualityOfService = NULL; \}//符号链接取设备名字wchar_t* GetSymbolicLinkDeviceName(wchar_t* pSymbolcLinkName){NTSTATUS status; UNICODE_STRING DeviceSymbolcLinkName; OBJECT_ATTRIBUTES objectAttributes;PUNICODE_STRING pLinkTarget; wchar_t* pDeviceName=NULL;HANDLE hSymbolic=NULL; ULONG unicode_length=0; typedef VOID (__stdcall *fnRtlInitUnicodeString)(IN OUT PUNICODE_STRING DestinationString,IN PCWSTR SourceString);static fnRtlInitUnicodeString pRtlInitUnicodeString=(fnRtlInitUnicodeString)GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")),"RtlInitUnicodeString");typedef NTSTATUS (__stdcall *fnZwQuerySymbolicLinkObject)(IN HANDLE LinkHandle,IN OUT PUNICODE_STRING LinkTarget,OUT PULONG ReturnedLength OPTIONAL);static fnZwQuerySymbolicLinkObject pZwQuerySymbolicLinkObject=(fnZwQuerySymbolicLinkObject)GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")),"ZwQuerySymbolicLinkObject");typedef NTSTATUS (__stdcall *fnZwOpenSymbolicLinkObject)(OUT PHANDLE LinkHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);static fnZwOpenSymbolicLinkObject pZwOpenSymbolicLinkObject=(fnZwOpenSymbolicLinkObject)GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")),"ZwOpenSymbolicLinkObject");pRtlInitUnicodeString(&DeviceSymbolcLinkName,pSymbolcLinkName); InitializeObjectAttributes(&objectAttributes,&DeviceSymbolcLinkName,OBJ_CASE_INSENSITIVE,NULL,NULL); //打开现有的符号链接 status=pZwOpenSymbolicLinkObject(&hSymbolic,SYMBOLIC_LINK_QUERY,&objectAttributes); if (NT_SUCCESS(status)){pLinkTarget=(PUNICODE_STRING)new wchar_t[MAX_PATH+sizeof(UNICODE_STRING)];ZeroMemory(pLinkTarget,MAX_PATH*sizeof(wchar_t)+sizeof(UNICODE_STRING));pLinkTarget->Length =MAX_PATH;pLinkTarget->MaximumLength = MAX_PATH;pLinkTarget->Buffer = (PWSTR)(((PUCHAR)pLinkTarget) + sizeof(UNICODE_STRING));status=pZwQuerySymbolicLinkObject(hSymbolic,pLinkTarget,&unicode_length);if (NT_SUCCESS(status)){pDeviceName=(wchar_t*)new BYTE[pLinkTarget->Length+sizeof(wchar_t)];ZeroMemory(pDeviceName,pLinkTarget->Length+sizeof(wchar_t));CopyMemory(pDeviceName,pLinkTarget->Buffer,pLinkTarget->Length);}SafeFreeArraySize(pLinkTarget);CloseHandle(hSymbolic);}return pDeviceName;}int main(void){GetSymbolicLinkDeviceName(TEXT("\\??\\PhysicalDrive0"));getchar();getchar();return 0;}
阅读全文
0 0
- GetSymbolicLinkDeviceName
- java计算两个日期之间有多少天
- Python(2) Python 模块帮助文档查询
- final关键字
- python语法简单入门
- Ubuntu16.04+cuda8.0+cudnn6.0+tensorflow(一)
- GetSymbolicLinkDeviceName
- win7 chrome Regex Search 插件 正则表达式搜索
- VIM 常用命令总结
- Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。
- RabbitMQ消息队列(二):”Hello, World“
- nginx出现(13: Permission denied)
- 原子性与原子操作
- 马云:阿里巴巴必须成为国家和世界创新的发动机
- 如何利用交叉编译工具为树莓派编译linux内核