正确获取磁盘大小
我正在尝试获取连接的USB闪存驱动器的物理设备大小.我尝试使用WMI. ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'"); foreach (ManagementObject moDisk in mosDisks.Get()) { lblCapacity.Text = "Capacity: " + moDisk["Size"]; } 我尝试使用导入来获取几何形状: var geo = new DiskGeometry(); uint returnedBytes; DeviceIoControl(Handle,
20 2024-04-21
编程技术问答社区
C#驱动开发?
在我跳入C#... 之前 我一直觉得C,或可能是C ++,最适合在Windows上开发驱动程序.我不喜欢在.NET机器上开发驱动程序的想法. 但是.NET似乎是MS进入应用程序开发的方式,因此我现在想知道: 人们是否正在使用C#开发驱动程序? 您是否必须执行很多API钩子,或者C#具有与内核相互作用的设施,而没有很多黑客? 有人可以谈谈接近0的C#程序的可靠性和安全性吗? 我希望我的设备在C#中可用,如果C#中的驱动程序Dev是成熟的,这显然是必经之路,但是如果不建议使用,我不想在那里花费很多努力. 说,开发一个简单的虚拟串行端口驱动程序有什么好的资源? -adam 解决方案 您无法在C#中制作内核模式设备驱动程序,因为运行时不能安全地加载到RIND0并按照预期运行. 此外,C#不创建适合加载作为设备驱动程序的二进制文件,尤其是关于驱动程序需要暴露的入口点.在加载过程中跳入并分析二进制的运行时间的依赖性禁止驱动程序子系统加载二进制的直接
6 2024-04-11
编程技术问答社区
用MapViewOfFile发送一个结构并读取一个未知值
我基本上试图将我的结构施放或复制到我的其他过程部分视图,但我一直遇到错误 C2760:语法错误:意外的令牌'标识符',预期'声明' 这就是我在做的: type RPM(UINT_PTR ReadAddress) { if (hDriver == INVALID_HANDLE_VALUE) { return {}; } DWORD64 Bytes; KM_READ_REQUEST ReadRequest{}; type response{}; ReadRequest.ProcessId = PID; ReadRequest.Address = ReadAddress; ReadRequest.Size = sizeof(type); ReadRequest.Output = &response; 问题在这里: auto pBuf = (ReadRequest)MapVi
10 2024-04-10
编程技术问答社区
查看链接器对可执行二进制文件使用的确切内存范围
我正在做一些OSDEV,并且我一直在尝试在内核中实现内存管理.我从物理内存管理器开始(这是一个32位OS).这个想法是要保留一个钻头,我们每个4K物理内存块分配一点.如果位是" 1",则使用该块,如果" 0"为" 0",则不是.我认为这张桌子应该追随内核.所以这是我的内核代码(最小): #include #define PMMAP 0x1000 //This contains information from int 15h/E820 #define BLOCK_SIZE 4096 #define SECTOR_SIZE 512 #define SECTORS_PER_BLOCK 8 #define BLOCK_SIZE_B 12 #define SECTOR_SIZE_B 9 #define SECTORS_PER_BLOCK_B 3 void pmmngr_init(uint32_t kernelsize,uint32_t mapentrycount
16 2024-04-10
编程技术问答社区
从用户模式增加线程数量
在Linux内核3.0+上是否有可能增加用户模式的线程量子?如何? 解决方案 我怀疑这是可能的.我很快找到了此页面(我想如果您真的需要它,应该可以编写一个改变它的内核模块,但是您正在进入痛苦的领域. 您在做什么,无论如何需要更长的量子长度?也许有另一种方法.
34 2024-04-10
编程技术问答社区
在debugfs中实现读取操作列表
我正在实现内核模块.使用几种技术. 其中1个是将读/写入不同的模块变量. 除了我在模块中的列表之外,我能够读取/编写所有变量. 链接列表: static struct node { struct list_head list; unsigned int x; struct tm time; }; 我想在debugf中有一个相应的文件,该文件将打印完整列表. 我尝试了所有"简单"读取函数,但它们实际上都没有起作用. 解决方案 您可以使用类似于此功能的函数读取列表: struct k_list { struct list_head links;
10 2024-04-10
编程技术问答社区
如何在不发生内核崩溃的情况下优雅地禁用中断线?
我已经实施了一个从键盘上读取的程序,并扫描代码并将其放入任务中.任务启动读取().因此,我的QT应用程序可以读取数据,如果找到L的扫描代码,它将向QT-Webkit发出回调.但是,当我在做角色驱动程序的RMMOD时.整个内核崩溃.我的角色驱动程序有什么问题. #include #include /** needed by all modules **/ #include /** This is for KERN_ALERT **/ #include /** for file operations **/ #include /** character device **/ #include /** for sys device registration in /dev/ and /sys/cl
14 2024-04-10
编程技术问答社区
编译器优化导致的投机性故障是如何在引擎盖下实现的?
这个问题是 COMPILER OPTIMAR-OPTIMAR可以违反逻辑中的操作数字和重新排序的内存访问权限的后续问题. - 和表达?. 考虑以下代码. if (*p && *q) { /* do something */ } 现在根据讨论的是否可以在逻辑和表达中违反操作数的短路和重新排序记忆访问和重新排序记忆访问?(尤其是David Schwartz评论和答案),标准配合c编译器的优化器可能会在*p之前访问*q的CPU指令,同时仍保持确定的序列行为可观察到的行为使用&& - 操作器. 因此,尽管优化器可能会在*p之前发出访问*q的代码,但它仍然需要确保仅当*p> *p是非 - 零.如果*p为零,则不应观察到*q引起的故障,即,由于*q首先在CPU上执行*q,将首先发生投机性故障,但是一旦*p>)将忽略投机性故障.被执行并发现为0. 我的问题:在引擎盖下如何实现这个投机性故障? ,如果您可以在回答此问题时,您会很感激. 据我所知,当CPU检
8 2024-04-09
编程技术问答社区
如何在Linux内核模块中的用户空间创建一个目录
以下将在用户空间中创建文件,但是如何创建一个目录? struct file *filp = filp_open("/home/myuser/Desktop/newfile", O_CREAT, S_IRWXU); 解决方案 我知道如何使用的最佳方法: mkdir("your/directory", 0700); 大卫·赫弗南(David Heffernan)的评论显示了具体信息. 编辑: 此页面将向您显示您可以为目录提供的不同模式参数及其所做的. http://osdir.com/ml/linux. C编程/2002-06/msg00069.html 其他解决方案 只是设置O_DIRECTORY filp_open flags.
12 2024-04-09
编程技术问答社区
奇怪的错误(解读不完整类型的指针)。
void get_cwd(char* buf) { char *result; current->fs->pwd; result = get_dentry_path(current->fs->pwd); memcpy(buf, result, strlen(result)+1); kfree(result); } 错误:将指针指向不完整的类型 错误指向电流 - > fs-> pwd; 包括: #include #include #include #include #include #include #include #include #include
10 2024-04-09
编程技术问答社区
Linux内核关联列表
我正在尝试使用Linux内核链接列表实现,但我无法编译.我正在完全关注这些来源,但没有结果( http://www.roman10.net/linux-kernel-programmminglink-list/和 a>) list.h list_head_init的内核宏如下: #define LIST_HEAD_INIT(name) { &(name), &(name) } struct Node { int data; struct list_head list; }; struct Node mylinkedlist; LIST_HEAD_INIT(&mylinkedlist.list); void add(){ struct Node first; first.data = 1; first.list = LIST_HEAD_INIT(first.list); list_add_tail(&first->list, &mylinkedlist.list
8 2024-04-09
编程技术问答社区
从内核驱动到达内核会话空间
我正在编写一个内核驱动程序,该驱动程序应该在内核会话空间(Win32k.sys)中阅读(在某些情况下也要编写)一些内存地址.我已经在另一个主题中阅读了,例如在WindBG中,我应该将上下文更改为一个随机用户进程,以读取内核会话空间的内存(使用.process/p).我该如何在内核驱动器中这样做?我应该创建与驱动程序通信的用户流程(这是我的想法,但我希望有一个更好的解决方案),或者对此有更简单的解决方案? 解决方案 会话空间未在系统地址空间中映射(驱动程序共享,如果未连接到任何过程).这些原因是您在访问Win32K时获得BSOD的原因. 您需要通过Kestackattachprocess将其附加到Eprocess上,以执行此操作.您可以使用ZwqueryInformationProcess(ProcessSessionInformation)函数获得会话ID. 其他解决方案 内核内存空间都在所有内核对象之间共享(就像DOS和早期Windows版本中的真实/未保护模式一
16 2024-04-09
编程技术问答社区
如何在Linux内核读取函数中复制_to_user一个字符串并使用offp
声明: static char status[128] = "off\0"; 并实现了read函数: static ssize_t read_proc(struct file *filep, char __user *buf, size_t len, loff_t *offp) { ssize_t cnt = strlen(status), ret; ret = copy_to_user(buf, status, cnt); *offp += cnt; return cnt; } 如何考虑offp? 当前它将无尽的status status 解决方案 感谢这些人在这里的评论,我想到了以下实现,我认为这是使用offp的正确方法: static ssize_t read_proc(struct file *filep, char __user *buf,
10 2024-04-09
编程技术问答社区
当我们投递Descriptor+Descriptor->SerialNumberOffset时,序列号枚举失败。
我有一个内核驱动程序,用于查找存储设备的序列号,但是驱动程序存在问题. Descriptor->SerialNumberOffset 是 103 但是 (LPCSTR)(UINT_PTR)Descriptor+(DWORD32)Descriptor->SerialNumberOffset 为null 这是我的代码 NTSTATUS GetDeviceTypeAndUniqueID(IN PDEVICE_OBJECT StorageStackDeviceObject, cwDevices *lDeviceTypeArg, char *pszUidArg) { DWORRD lDeviceType=0; STORAGE_PROPERTY_QUERY Query; STORAGE_DEVICE_DESCRIPTOR Buffer[4]; NTSTATUS Status = STATUS_SUCCESS;
12 2024-04-09
编程技术问答社区
具有自旋锁冻结的Linux内核线程
我有两个内核线程,我试图以另一种方式从这两个线程中打印出来.我正在使用 spinlock 同步这两个线程. int kthread_1_function(void *data) { while(1) { spin_lock(&lock1); pr_alert("In Kernel Thread 1!!!\n"); spin_unlock(&lock2); if(kthread_should_stop()) { spin_unlock(&lock2); return 1; } } return 0; } int kthread_2_function(void *data) { while(1) { spin_lock(&lock2);
18 2024-04-09
编程技术问答社区
在OS内核链接中未定义的引用
我有问题.我在本教程中制作简单的OS内核: > 但是,如果我想链接文件boot.o和kernel.o,GCC编译器会返回此错误: boot.o: In function `start': boot.asm:(.text+0x6): undefined reference to `kernel_main' collect2.exe: error: ld returned 1 exit status. 文件来源: boot.asm ; Declare constants used for creating a multiboot header. MBALIGN equ 1
12 2024-04-09
编程技术问答社区
无法从内核模块中的net_device获取mac地址
这是我的钩函数 unsigned int my_packet_pass_through_hook(const struct nf_hook_ops *ops, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff*)){ 我在预处理和浮游阶段已注册.我只是将net_device信息转储到此功能中. 在预先阶段,我正在倾倒 struct struct net_device * 中,而在poStrouting阶段,我正在倾倒 const struct net_device *out net_devoce结构. 在两种情况下,我都无法打印设备的MAC地址. printk(KERN_ALERT "
16 2024-04-09
编程技术问答社区
为什么setrlimit(RLIMIT_NPROC)以root身份运行时不工作,而以普通用户运行时却能正常工作?
我编写了以下C程序,以限制该程序可以创建的最大进程(在Linux上).该程序使用setrlimit(),预计该程序最多可以在4个过程中创建. // nproc.c #include #include #include int main(void) { struct rlimit rlim; rlim.rlim_cur = rlim.rlim_max = 4; setrlimit(RLIMIT_NPROC, &rlim); for (int i = 0; i
8 2024-04-09
编程技术问答社区
不正确的内存访问:为什么我的内核*不*崩溃?
我想向某人展示一个不正确的内存访问的例子(kernelspace试图访问用户空间内存导致错误). 因此,我以旧教程为POC,重要的部分是: static ssize_t dev_write(struct file *filep, const char *buffer, size_t len, loff_t *offset){ sprintf(message, "%s(%zu letters)", buffer, len); // appending received string with its length // [...] } 这会导致我的一个环境测试中的崩溃,这是预期的行为(我在不使用cpoy_*_user函数的情况下访问用户空间变量的缓冲区我的过程被杀死. 但是在另一台机器中,这个片段实际上可以正常工作,这对我来说似乎真的很奇怪.这两台机器使用的5.3内核具有非常相似的内核配置. VM不会崩溃?我的代码实际上是UB吗?我想念什么吗?
12 2024-04-09
编程技术问答社区