我有2个问题,想给200分的,答对一个给100分(另100分再开贴给)。
1.如何读取主板是否起用了自动开机功能(主板已支持该功能),如没有启用怎么写程序让它启用。
2.如主板已启用自动开机功能,如何读取是everyday还是weekdays模式,以及如何读取设定的时间(几点几分几秒),当然也要有如何修改的代码。
1.如何读取主板是否起用了自动开机功能(主板已支持该功能),如没有启用怎么写程序让它启用。
2.如主板已启用自动开机功能,如何读取是everyday还是weekdays模式,以及如何读取设定的时间(几点几分几秒),当然也要有如何修改的代码。
解决方案 »
- WinExec调用Mono传参数
- 本地运行Asp.net项目
- 【在线等】winform中如何获取要上传文件的大小?
- C# 多线程 并行 WinForm
- 请问各位高手怎样做异形窗体,重谢
- c#在命在命令提示符下的错误提示
- C#里面有类似Java里的Clone方法吗??如果有的话能实现深度Copy吗??
- wpf怎么把checkbox放到combobox里面..
- 为什么一定要static void Main ()
- C#中的string如何转成VC的CString
- 求 章立民的 《visual C# 2005 程序开发与界面设计秘诀》电子书 下载地址
- 求救:DataGridView的属性窗口没有任何内容了
除非有其他语言写的DLL可以用
netapi32.dll好像可以实现对Bois的操作。
LZ好好研究netapi32.dll看看。
BiosCharacteristics
BIOSVersion
BuildNumber
Caption
CodeSet
CurrentLanguage
Description
IdentificationCode
InstallableLanguages
InstallDate
LanguageEdition
ListOfLanguages
Manufacturer
Name
OtherTargetOS
PrimaryBIOS
ReleaseDate
SerialNumber
SMBIOSBIOSVersion
SMBIOSMajorVersion
SMBIOSMinorVersion
SMBIOSPresent
SoftwareElementID
SoftwareElementState
Status
TargetOperatingSystem
Version
====
源码如下:
string boisInfo = "";
try
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS"); foreach (ManagementObject mo in searcher.Get())
{
PropertyDataCollection pdc = mo.Properties;
PropertyData[] pd = new PropertyData[mo.Properties.Count];
pdc.CopyTo(pd, 0);
for (int i = 0; i < mo.Properties.Count; i++)
{
string protertyName = pd[i].Name;
boisInfo = boisInfo + "|" + protertyName;
}
}
}
catch(Exception x)
{
MessageBox.Show(x.ToString());
}
=================================================================这个应该和具体的主板有关吧,这些参数也许放在coms不同的存储器芯片上
------------------------------------------------------------------------
我想这个应该和什么主板没有关系的,主板应该都是ACPI标准的。
然后外包出去让人家用c++ 内联汇编 写个com 然后调用之
if(LAN.跳线 == Close)
MessageBox.Show("硬件支持开机")
else if(Bios.Wakeup.EnableLANWakeup == true)
MessageBox.Show("Bios设置了远程唤醒")
else
MessageBox.Show("不能硬件开机")哈哈哈,这样如何?
大家都知道,windows接管了对物理内存的直接存取,而bios信息存在物理内存
的f000:0000处,关键就是如何读取物理内存。
查阅了msdn的文章后,发现以下有几个函数和物理内存访问有关:
NTSTATUS ZwOpenSection(OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);
NTSTATUS ZwMapViewOfSection(IN HANDLE SectionHandle,
IN HANDLE ProcessHandle,
IN OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN ULONG CommitSize,
IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
IN OUT PSIZE_T ViewSize,
IN SECTION_INHERIT InheritDisposition,
IN ULONG AllocationType,
IN ULONG Protect
);
NTSTATUS ZwUnmapViewOfSection(IN HANDLE ProcessHandle,IN PVOID BaseAddress); 用到的结构定义如下 typedef struct _UNICODE_STRING {
USHORT Length;//长度
USHORT MaximumLength;//最大长度
PWSTR Buffer;//缓存指针,访问物理内存时,此处指向UNICODE字符串"\device\physicalmemory"
} UNICODE_STRING,*PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;//长度 18h
HANDLE RootDirectory;// 00000000
PUNICODE_STRING ObjectName;//指向对象名的指针
ULONG Attributes;//对象属性00000040h
PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR,0
PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES; 函数说明
第一个函数ZwOpenSection用来打开section,第一个参数是指向HANDLE变量的指针,第二个是访问参数,第三个是指向OBJECT_ATTRIBUTES的指针
第二个函数ZwMapViewOfSection用来建立物理内存和当前进程的一段物理内存的联系,参数很多,一会在例程里再详细解释
第三个函数ZwUnmapViewOfSection用来断开物理内存和当前进程中的映射断开联系,第一个参数是进程句柄,必须掉用第二个函数时一样,第二
个是当前进程中映射的基址,由ZwMapViewOfSection返回 这三个函数都在ntdll.dll中,msdn里的帮助说这几个函数用在驱动编制上。
例程如下 //结构定义
typedef struct _UNICODE_STRING {
USHORT Length;//长度
USHORT MaximumLength;//最大长度
PWSTR Buffer;//缓存指针
} UNICODE_STRING,*PUNICODE_STRING; typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;//长度 18h
HANDLE RootDirectory;// 00000000
PUNICODE_STRING ObjectName;//指向对象名的指针
ULONG Attributes;//对象属性00000040h
PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR,0
PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES; //函数指针变量类型生命
typedef DWORD (__stdcall *ZWOS)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES);
typedef DWORD (__stdcall *ZWMV)(HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULONG);
typedef DWORD (__stdcall *ZWUMV)(HANDLE,PVOID);
//以上在程序开始定义全局变量处定义 //以下在程序的主函数里
//变量声明
UNICODE_STRING struniph;
OBJECT_ATTRIBUTES obj_ar;
ZWOS ZWopenS;
ZWMV ZWmapV;
ZWUMV ZWunmapV;
HANDLE hSection;
DWORD ba;
LARGE_INTEGER so;
SIZE_T ssize;
so.LowPart=0x000f0000;//物理内存的基址,就是f000:0000
so.HighPart=0x00000000;
ssize=0xffff;
wchar_t strPH[30]=L"\\device\\physicalmemory";
//变量初始化
ba=0;//联系后的基址将在这里返回
struniph.Buffer=strPH;
struniph.Length=0x2c;//注意大小是按字节算
struniph.MaximumLength =0x2e;//也是字节
obj_ar.Attributes =64;//属性
obj_ar.Length =24;//OBJECT_ATTRIBUTES类型的长度
obj_ar.ObjectName=&struniph;//指向对象的指针
obj_ar.RootDirectory=0;
obj_ar.SecurityDescriptor=0;
obj_ar.SecurityQualityOfService =0;
//读入ntdll.dll,得到函数地址
hinstLib = LoadLibrary("ntdll.dll");
ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");
ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");
ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");
//调用函数,对物理内存进行映射
ZWopenS(&hSection,4,&obj_ar);
ZWmapV(
(HANDLE)hSection, //打开Section时得到的句柄
(HANDLE)0xffffffff, //将要映射进程的句柄,
&ba, //映射的基址
0, //没怎么看明白,设为0就好了
0xffff, //分配的大小
&so, //物理内存的地址
&ssize, //指向读取内存块大小的指针
1, //子进程的可继承性设定
0, //分配类型
2 //保护类型
);
//执行后会在当前进程的空间开辟一段64k的空间,并把f000:0000到f000:ffff处的内容映射到这里
//映射的基址由ba返回,如果映射不在有用,应该用ZwUnmapViewOfSection断开映射
====================================
paulbin() 兄 你的那段代码恕我水平有限没怎么看懂,感觉大概只和内存操作有关,好像和我的需求关系不大。
--------------------------------------lovebanyi(风云(lookcode.net)) 兄 的想法我也是想过的,可就是找不到善于这方面的人才来这里问的,就是希望大家看在这200分的份上给出个完整的或核心的东西。
-------------------------------------zzmsl(周先生) 兄 你的提议是我这两天一直在研究的,可就是没有结果。
paulbin()的方法中提到:
bios信息存在物理内存的f000:0000处,代码执行后会在当前进程的空间开辟一段64k的空间,并把f000:0000到f000:ffff处的内容映射到这里。整个方法也没怎么看懂,不过好像paulbin()的解法值得仔细研究下
-----------------------------------------------------------------------
mapserver(杨东 http://mapserver.cnblogs.com) 兄 我以前也是觉得主板存在差异,这是不可能实现的,可经过调查发现,电源的生产都符合ACPI标准,所以他的接口都是应该相同的,也就不存在差异的问题了。