exe 与 sys 交互 缓冲区方式 读写操作

用户层函数

HANDLE WINAPI CreateFile(                                   成功返回句柄 失败返回INVALID_HANDLE_VALUE
  __in      LPCTSTR lpFileName,                                要打开文件或者驱动的名字
  __in      DWORD dwDesiredAccess,                       要打开文件或者驱动的权限  GENERIC_READ | GENERIC_WRITE
  __in      DWORD dwShareMode,                            文件或者驱动的共享模式  0  非共享
  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,                    安全描述符    NULL
  __in      DWORD dwCreationDisposition,               驱动一般用 OPEN_EXISTING
  __in      DWORD dwFlagsAndAttributes,                一般用 FILE_ATTRIBUTE_NORMAL
  __in_opt  HANDLE hTemplateFile                          模版文件,如果打开的是一个已经存在的文件,将会忽略这个参数。NULL
);

BOOL WINAPI CloseHandle(
  __in  HANDLE hObject                                          前面打开的句柄
);

BOOL WINAPI DeviceIoControl(                             
  __in         HANDLE hDevice,                                   CreateFile打开的句柄
  __in         DWORD dwIoControlCode,                    控制字段   CTL_CODE  类型的宏   
  __in_opt     LPVOID lpInBuffer,                              输入数据的缓冲区指针
  __in         DWORD nInBufferSize,                           缓冲区的大小
  __out_opt    LPVOID lpOutBuffer,                          输出数据的缓冲区指针
  __in         DWORD nOutBufferSize,                        缓冲区的大小
  __out_opt    LPDWORD lpBytesReturned,             下面是NULL 这个参数不能为空   实际操作数
  __inout_opt  LPOVERLAPPED lpOverlapped          NULL
);

 

#define CTL_CODE                                               引用该宏要引入 #include "winioctl.h" 

(

 DeviceType,                                                          设备的类型  创建设备时间设置的设备类型一致        FILE_DEVICE_UNKNOWN

 Function,                                                               位于2048-4095之间                 2048

 Method,                                        METHOD_BUFFERED  METHOD_IN_DIRECT  METHOD_OUT_DIRECT      METHOD_NEITHER       四种交互模式   缓冲区 直接   其他读取方式                                                

 Access                                          权限      FILE_ANY_ACCESS



BOOL WINAPI WriteFile(
  __in         HANDLE hFile,                                       句柄
  __in         LPCVOID lpBuffer,                                 输入数据的缓冲区
  __in         DWORD nNumberOfBytesToWrite,        输入数据的字节数
  __out_opt    LPDWORD lpNumberOfBytesWritten,    真是操作的字节数
  __inout_opt  LPOVERLAPPED lpOverlapped            NULL
);
BOOL WINAPI ReadFile(
  __in         HANDLE hFile,                                        句柄
  __out        LPVOID lpBuffer,                                   输出数据的缓冲区
  __in         DWORD nNumberOfBytesToRead,          读取数据的字节数
  __out_opt    LPDWORD lpNumberOfBytesRead,     实际读取的字节数
  __inout_opt  LPOVERLAPPED lpOverlapped           NULL
);

 

 

PVOID MmGetSystemAddressForMdlSafe(                 直接访问模式的 内存地址的映射地址读取函数
  [in]  PMDL Mdl,                                                         pIrp->MdlAddress
  [in]  MM_PAGE_PRIORITY Priority                             NormalPagePriority    一般用这个
);

 

exe   代码部分   MFC VC6.0

 

 HANDLE ddkh;
 int a[2];
 int b;
 ULONG c;
 int key;
// UpdateData(true);
// m_sum=m_x+m_y;
// UpdateData(false);
 ddkh=CreateFile(
  ".//firstddk",                                // Òª´ò¿ªÎļþ»òÕßÇý¶¯µÄÃû×Ö
  GENERIC_READ | GENERIC_WRITE,                  //     Òª´ò¿ªÎļþ»òÕßÇý¶¯µÄȨÏÞ  GENERIC_READ | GENERIC_WRITE
  0,                           // Îļþ»òÕßÇý¶¯µÄ¹²Ïíģʽ  0  ·Ç¹²Ïí
    NULL,    //                °²È«ÃèÊö·û    NULL
    OPEN_EXISTING,              // Çý¶¯Ò»°ãÓà OPEN_EXISTING
    FILE_ATTRIBUTE_NORMAL,               // Ò»°ãÓÃ FILE_ATTRIBUTE_NORMAL
    NULL                     //     Ä£°æÎļþ£¬Èç¹û´ò¿ªµÄÊÇÒ»¸öÒѾ­´æÔÚµÄÎļþ£¬½«»áºöÂÔÕâ¸ö²ÎÊý¡£NULL
 );
 if(ddkh==INVALID_HANDLE_VALUE)
 {
  MessageBox("´ò¿ªÇý¶¯Ê§°Ü",NULL,MB_ICONEXCLAMATION);
  return ;
 }
 else
 {
  MessageBox("´ò¿ªÇý¶¯³É¹¦",NULL,MB_ICONEXCLAMATION);
 }
 UpdateData(true);
 a[0]=m_x;
 a[1]=m_y;
 key=DeviceIoControl(                            
  ddkh,                              //     CreateFile´ò¿ªµÄ¾ä±ú
  CODE,                   // ¿ØÖÆ×ֶΠ   
  a,                         //     ÊäÈëÊý¾ÝµÄ»º³åÇøÖ¸Õë
  8,                      //     »º³åÇøµÄ´óС
  &b,                       //   Êä³öÊý¾ÝµÄ»º³åÇøÖ¸Õë
  4,                   //     »º³åÇøµÄ´óС
  &c,             //
  NULL        //  NULL
 );
 if(key==0)
 {
  MessageBox("»º³åÇø¶Áдʧ°Ü",NULL,MB_ICONEXCLAMATION);
 }
 else
 {
 m_sum=b;
 UpdateData(false);
 }
 CloseHandle(ddkh);

 

SYS 相应的 派遣函数的代码   DDK  1830

 

NTSTATUS ddk_add(PDEVICE_OBJECT DeviceObject,PIRP Irp)
{
 int *a;
 int x;
 a=(int *)Irp->AssociatedIrp.SystemBuffer;               //读取传入的数据所在内存地址的指针
// *a=*a+*(a+1);
// *(int *)Irp->AssociatedIrp.SystemBuffer=*a;
  _asm
   {
         mov eax,a
      mov ebx,[eax]
      add ebx,[eax+4]
      mov [eax],ebx
    }
 Irp->IoStatus.Information=4;
 Irp->IoStatus.Status=STATUS_SUCCESS;
 IoCompleteRequest(Irp,IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SPI(Serial Peripheral Interface)是一种串行通信协议,可以用于与外设进行数据交互。W25Q64是一款64Mb的串行Flash存储器,支持SPI接口。 以下是使用C语言进行SPI读写W25Q64的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/spi/spidev.h> #define SPI_DEVICE "/dev/spidev0.0" // SPI设备节点路径 #define BUFFER_SIZE 256 // 缓冲区大小 int main() { int fd, ret; uint8_t tx_buffer[BUFFER_SIZE], rx_buffer[BUFFER_SIZE]; struct spi_ioc_transfer tr; // 打开SPI设备 fd = open(SPI_DEVICE, O_RDWR); if (fd < 0) { perror("Failed to open SPI device"); exit(1); } // 初始化SPI传输结构体 memset(&tr, 0, sizeof(tr)); tr.tx_buf = (unsigned long)tx_buffer; tr.rx_buf = (unsigned long)rx_buffer; tr.len = BUFFER_SIZE; tr.speed_hz = 10000000; tr.bits_per_word = 8; // 发送写命令 tx_buffer[0] = 0x06; // 写使能 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send write enable command"); exit(1); } tr.len = 4; tx_buffer[0] = 0x02; // 写指令 tx_buffer[1] = 0x00; // 地址高位 tx_buffer[2] = 0x00; // 地址中位 tx_buffer[3] = 0x00; // 地址低位 memcpy(tx_buffer + 4, "Hello", 5); // 写入数据 // 发送写数据命令 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send write command"); exit(1); } // 发送读命令 tr.len = 4; tx_buffer[0] = 0x03; // 读指令 tx_buffer[1] = 0x00; // 地址高位 tx_buffer[2] = 0x00; // 地址中位 tx_buffer[3] = 0x00; // 地址低位 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 0) { perror("Failed to send read command"); exit(1); } printf("Data read from flash memory: %s\n", rx_buffer + 4); // 关闭SPI设备 close(fd); return 0; } ``` 以上代码演示了如何使用SPI接口读写W25Q64芯片。其中,首先通过ioctl函数设置SPI传输参数和指令,然后通过ioctl函数发送指令,并通过缓冲区读取或写入数据。 需要注意的是,通过SPI接口读写W25Q64芯片需要按照其通信协议进行操作,具体指令和数据格式可参考W25Q64的数据手册。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值