.386
.model flat,stdcall
option casemap:none
include kernel32.inc
includelib kernel32.lib
.data?
hstdin dd ?
hstdout dd ?
x dd ?
y dword ?
buffer db 2000h dup (?)
.code
;数据定义在代码段,可使文件更小。
;若想写代码段定义的变量,请在在编译时加:/section:.text,rw
notice db "list all of existing MS-DOS device names",13,10,\
"made by correy",13,10,\
"QQ:112426112",13,10,\
"Email:leguanyuan@126.com",13,10,\
"Homepage:http://correy.webs.com",13,10,\
"不足之处,敬请指导。",13,10,\
"注意显示格式,可以在运行窗口的标题上右键选择属性-->布局-->里面的窗口大小或缓冲区的大小,进行改变。",13,10,0
;我想这也可以用编程实现。
outtitle db "按回车键退出!",13,10,0
entry db 13,10,0
start:invoke GetStdHandle,-10
mov hstdin,eax
invoke GetStdHandle,-11
mov hstdout,eax
invoke QueryDosDevice,0,addr buffer,2000h
mov x,eax
lea esi,buffer
mov edi,0
invoke WriteFile,hstdout,addr notice,sizeof notice-1,offset y,0
show:
invoke lstrlen,esi
push eax
invoke WriteFile,hstdout,esi,eax,addr y,0
invoke WriteFile,hstdout,addr entry,2,offset y,0
pop eax
inc eax
add esi,eax
add edi,eax
cmp edi,x
jne show
invoke WriteFile,hstdout,addr outtitle,sizeof outtitle-1,offset y,0
invoke ReadFile,hstdin,addr buffer,sizeof buffer,addr y,0
ret
end start
;made at 2010.11.05
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
ade by correy
made at 2014.04.15
email:kouleguan at hotmail dot com
homepage:http://correy.webs.com
*/
#include <Windows.h>
bool get_symbollink_from_devicename(IN wchar_t * device_name, OUT wchar_t * symbol_link_name)
/*
功能:根据设备名获取符号链接名.
device_name:格式心形如:\Device\USBPDO-3.
symbol_link_name的内容不可以太小,不小于MAX_PATH.
*/
{
bool b = false;
if (device_name == NULL || * device_name == 0 || symbol_link_name == NULL) {
return false;
}
DWORD ucchMax = 0x1000;//大概一个页面的大小.
LPTSTR buffer = (LPTSTR)HeapAlloc(GetProcessHeap(),0,ucchMax);
int x = 0;
while (!(x = QueryDosDevice(NULL, buffer, ucchMax / sizeof(wchar_t)))) //不除以2,第二次运行的时候出错,可能是内存越界了.注意TCHARs.
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (buffer) {
HeapFree(GetProcessHeap(), 0, buffer);
buffer = NULL;
}
ucchMax *= 2; //翻倍增长.
buffer = (LPTSTR)HeapAlloc(GetProcessHeap(),0,ucchMax);
if (!buffer){
return false;
}
RtlZeroMemory(buffer, ucchMax);
} else {
return false;
}
}
LPTSTR buffer0 = buffer;//这个变量供释放用的.
int s = 0;
int i = 0;
while (s < x)
{
i++;
if (lstrlen(buffer) == 0) {
break;//结束了.没有找到.
}
wchar_t d[MAX_PATH] = {0};
QueryDosDevice(buffer,d,sizeof (d));
int t = lstrlen(buffer);
buffer = buffer + t + 1;
printf("符号链接:%ws", buffer);
wchar_t temp[MAX_PATH] = {0};
if (!QueryDosDevice(buffer,temp,MAX_PATH / sizeof(wchar_t))) {
break;
}
printf("设备名:%ws\n", temp);
if (lstrcmpi(temp, device_name) == 0) {//注意设备在禁用的状态下是搜索不到的.
b = true;
lstrcpy(symbol_link_name, buffer);
}
s = s + t + 1;
}
HeapFree(GetProcessHeap(), 0, buffer0);
return b;
}
int main()
{
wchar_t symbol_link_name[MAX_PATH] = {0};
bool b = get_symbollink_from_devicename(L"\\Device\\USBPDO-3", symbol_link_name);
if (b) {
MessageBox(0,L"OK",0,0);
} else {
MessageBox(0,L"fail",0,0);
}
return 0;
}
2012年7月5日星期四
设备对象和符号链接及转换的应用成代码
订阅:
博文评论 (Atom)
没有评论:
发表评论