我需要获取HDD序列号,以将其用作许可软件的密钥.我在这个url中使用了diskid32代码:http://www.winsim.com/diskid32/diskid32.html 它使用了DeviceIoControl Win32 API和IO控制代码IOCTL_STORAGE_QUERY_PROPERTY.
有效.但是,当我仔细检查硬盘本身上印刷的实际序列号时,我发现该号码的每2个字节都被翻转了.
一个简单的解决方案可能是简单地将字节翻转回来.它适用于Windows XP,Vista和7,但在Windows 8中不需要翻转!
我想知道在Windows XP,Vista和7中翻转字节的确切原因,以及为什么不在Windows 8中翻转.下一个Windows怎么样?
部分代码略有变化:
int drive = 0;
HANDLE hPhysicalDriveIOCTL = 0;
char driveName [256];
sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
// Windows NT, Windows 2000, Windows XP - admin rights not required
hPhysicalDriveIOCTL = CreateFile (driveName, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
{
_STORAGE_PROPERTY_QUERY query;
DWORD cbBytesReturned = 0; …Run Code Online (Sandbox Code Playgroud) 我正在尝试读取/写入FM24CL64-GTR FRAM通过地址上的I2C总线连接的芯片0b 1010 011.
当我试图写3个字节(数据地址2个字节,+数据一个字节)时,我得到一个内核消息([12406.360000] i2c-adapter i2c-0: sendbytes: NAK bailout.),以及写返回!= 3.参见下面的代码:
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
int file;
char filename[20];
int addr = 0x53; // 0b1010011; /* The I2C address */
uint16_t dataAddr = 0x1234;
uint8_t val = 0x5c;
uint8_t buf[3];
sprintf(filename,"/dev/i2c-%d",0);
if ((file = open(filename,O_RDWR)) < 0)
exit(1);
if (ioctl(file,I2C_SLAVE,addr) < 0)
exit(2);
buf[0] = dataAddr >> 8;
buf[1] = dataAddr & 0xff;
buf[2] = val;
if (write(file, buf, 3) …Run Code Online (Sandbox Code Playgroud) 我正在编写一个驱动程序来控制一些自定义硬件.
在过去(即15年前),我正在这样做ioctls,但现在正在挖掘sysfs作为一种可能的选择.
mutex驱动程序进行" 保护",以便一次只能有一个应用程序写入.(我确实有一些只读'信息'条目,我希望所有人都可以随时访问这些条目).鉴于上述情况,最好的方法是什么 - ioctl或sysfs?
如果是sysfs,那我该如何实现独占访问?
如果sysfs,那么如果驱动程序没有读/写/ ioctl fops,它是否需要打开/释放?!
(这是一个'私人'司机,所以我不在乎大规模;)但是如果新的方式更适用,那么我可能会抓住它们!)
谢谢.
我想使用系统蜂鸣器生成具有特定频率和长度(针对不同声音信号)的蜂鸣声(并且如果蜂鸣器不可用/可访问则仅扬声器).我知道可以通过使用ioctl来实现这一点,但这需要root访问权限,这是我不想要的.
我知道我可以使用"beep"命令,但这将是一个依赖项,如果可能的话,不应该使用它(根本没有外部依赖项,只有基本的linux库和C).
我目前拥有的是以下代码(但这需要超级用户权限才能运行):
#include <stdlib.h>
#include <fcntl.h>
#include <linux/kd.h>
int main(int argc, char *argv[])
{
int fd = open("/dev/console", O_RDONLY);
if (fd == -1 || argc != 3) return -1;
return ioctl(fd, KDMKTONE, (atoi(argv[2])<<16)+(1193180/atoi(argv[1])));
}
Run Code Online (Sandbox Code Playgroud)
如果没有其他方法可以做到这一点,那么我将使用蜂鸣声,但我真的想避免依赖并将蜂鸣声直接集成到我的脚本中,但我相信这里有人会知道解决方案/解决方法.
我真的不想要外部库,因为程序应该尽可能轻量级.
我想知道我的TCP套接字有多少字节可读.我用标志"FIONREAD"调用ioctl,它实际上应该给我这个值.当我调用函数时,我得到返回值0(所以没有错误),但我的整数参数得到值0.这没有问题但是当我调用recv()方法时,我实际上从套接字中读取了一些字节.我究竟做错了什么?
//这里有一些代码:
char recBuffer[BUFFERLENGTH] = {0};
int bytesAv = 0;
int bytesRead = 0;
int flags = 0;
if ( ioctl (m_Socket,FIONREAD,&bytesAv) < 0 )
{
// Error
}
if ( bytesAv < 1 )
{
// No Data Available
}
bytesRead = recv(m_Socket,recBuffer,BUFFERLENGTH,flags);
Run Code Online (Sandbox Code Playgroud)
当我调用recv函数时,我实际读取了一些有效的数据(我预期的)
我正在开发一个使用unlocked_ioctl的内核模块.我用内核版本2.6.24-23-generic测试了它,它运行得很好.现在我尝试使用内核版本3.3.1-1-ARCH并且发生了一些奇怪的事情:当请求值(cmd)为2时,不会执行ioctl函数.它返回0,但函数未执行.为了检查它是否未执行,我执行了以下操作:
static long midriver_ioctl(struct file *file,
unsigned int cmd, unsigned long arg) {
printk("Called with cmd = %d\n", cmd);
Run Code Online (Sandbox Code Playgroud)
我写了一个测试程序,从0到4096调用此设备的ioctl,我可以在dmesg中看到所有这些值的消息"用cmd = n调用",除了"2",唯一没有显示的值.
关于我做错了什么的线索?
先感谢您,
我正在通过ioctl示例程序来检查它与内核空间的通信方式.在程序WRITE_IOCTL中用作命令
#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)
ioctl(fd, WRITE_IOCTL, "hello world")
Run Code Online (Sandbox Code Playgroud)
我无法理解它是什么_IOW(MY_MACIG, 1, int).这是我下载程序的链接.请帮我.
http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-4.html
我正在设计一个Linux角色设备驱动程序.我想在ioctl()系统调用中发生错误时设置errno.
long my_own_ioctl(struct file *file, unsigned int req, unsigned long arg)
{
long ret = 0;
BOOL isErr = FALSE;
// some operation
// ...
if (isErr) {
// set errno
// ... <--- What should I do?
ret = -1;
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能实现这一目标?提前谢谢你!
请允许我更详细地解释我的申请.
我的设备位于/ dev/myCharDev中.我的用户空间应用程序是这样的:
#define _COMMAND (1)
#define _ERROR_COMMAND_PARAMETER (-1)
int main()
{
int fd = open("/dev/myCharDec", O_RDONLY);
int errnoCopy;
if (fd) {
if (ioctl(fd, _COMMAND, _ERROR_COMMAND_PARAMETER) < 0) { // should cause error in …Run Code Online (Sandbox Code Playgroud) 我正在运行一个自托管的 Renovate 实例,我需要使用 GPG 密钥签署对 GitLab 的提交。
为此,我使用我的 GitLab 用户的 PGP 私钥块设置环境变量 RENOVATE_GIT_PRIVATE_KEY,并且该变量会自动导入。
但当我尝试这样做时,出现以下错误:
gpg: directory '/home/ubuntu/.gnupg' created
gpg: keybox '/home/ubuntu/.gnupg/pubring.kbx' created
gpg: /home/ubuntu/.gnupg/trustdb.gpg: trustdb created
gpg: key 72A96C0D4FA8543C: public key "Dummy User <dummyuser@company.com>" imported
gpg: key 72A96C0D4FA8543C/72A96C0D4FA8543C: error sending to agent: Inappropriate ioctl for device
gpg: error building skey array: Inappropriate ioctl for device
gpg: error reading '/tmp/git-private.key': Inappropriate ioctl for device
gpg: import from '/tmp/git-private.key' failed: Inappropriate ioctl for device
gpg: Total number processed: 0
gpg: imported: 1 …Run Code Online (Sandbox Code Playgroud)