调试某驱动

PsSetLoadImageNotifyRoutine loadImageNotifyRoutine 中拿全路径 PsSetLoadImageNotifyRoutine#include <ntifs.h>#include <ntddk.h>#include <Ntstrsafe.h>#include <fltKernel.h>//删除指针#define SafeFreeDelete(pData) { if(pData){ExFreePool(pData);pDa... 阅读详情
 作 者: softworm
时 间: 2008-08-27,20:49
链 接: http://bbs.pediy.com/showthread.php?t=71523

调试某驱动


写个驱动,观察某驱动的运行,学学驱动而已。先注册映像加载通知例程。

PsSetLoadImageNotifyRoutine(LoadImageNotify);

代码:
VOID LoadImageNotify (
  PUNICODE_STRING FullImageName, 
  HANDLE ProcessId, 
  PIMAGE_INFO ImageInfo
  )
{
  ANSI_STRING  asImageName;
  PCHAR    Delimiter;
  NTSTATUS  Status;
  ULONG    Base;
  ULONG    Entry;
  ULONG    Patch;
  ULONG    i;
  
  
  RtlUnicodeStringToAnsiString(&asImageName, FullImageName, TRUE);
  
  if (!ImageInfo->SystemModeImage)
  {
    goto __End; //不是驱动
  }
  
  Delimiter = strrchr(asImageName.Buffer, '//');
  if (Delimiter == NULL)
    goto __End;
  
  Delimiter++;
  
  if( _strnicmp(Delimiter,"xxx.sys",strlen("xxx.sys")) != 0)
    goto __End;

  Base = (ULONG)ImageInfo->ImageBase;
        
  DbgPrint("%s Loaded, MappingAddress=%08X, Size=%08X/n",
     asImageName.Buffer,
     ImageInfo->ImageBase,
     ImageInfo->ImageSize );
  

  //这里地址直接硬编码了,可以分析PE文件及使用反汇编引擎(原代码的地址删了,表找我麻烦)

  // 原驱动DriverEntry出口:
  //   leave
  //   retn    8
  //   
  //   

  Entry = Base + 0x1111;
  Patch = Base + 0x2222;
  g_ReturnAddress = Base + 0x3333;

  if (!(*(PULONG)Entry == 0x83EC8B55 &&  *(PUCHAR)(Entry+5) == 0x14)) //检查Entry
  {
    DbgPrint("Mismatched Entry!/n");
    goto __End;
  }

  if (*(PULONG)Patch != 0x0008C2C9)
  {
    DbgPrint("Mismatched Patch Point!/n");
    goto __End;
  }

  __asm
  {
    CLI
    MOV   EAX, CR0
    AND   EAX, NOT 10000H  //disable WP bit
    MOV   CR0, EAX
  }

  *(PUCHAR)Entry = 0xE9;
  *(PULONG)(Entry+1) = (ULONG)&SaveDriverObject - (Entry+5);

  *(PUCHAR)Patch = 0xE9;
  *(PULONG)(Patch+1) = (ULONG)&ReplaceDispatch - (Patch+5);
  

  __asm
  {
    MOV   EAX, CR0
    OR    EAX, 10000H  //enable WP bit
    MOV   CR0, EAX
    STI
  }
  
__End:
  RtlFreeAnsiString(&asImageName);
}
这个函数Patch原驱动2处:

原驱动的DriverEntry入口,目的是获取参数DriverObject,因为编译器的优化,在DriverEntry
执行过程中这个参数被清0了, 所以先保存一份。

第2是DriverEntry的出口,在这里替换DriverObject内注册的派遣函数。

代码:
VOID __declspec (naked) SaveDriverObject()
{
  // 55               push    ebp
  // 8B EC            mov     ebp, esp
  // 83 EC 14         sub     esp, 14h

  __asm {
    pushad
    mov  eax, [esp+20h+4]
    mov  g_DrvObj, eax
    popad

    push ebp ; 原代码
    mov  ebp, esp
    sub  esp, 14h

    jmp  [g_ReturnAddress]
  }
}


VOID __declspec (naked) ReplaceDispatch()
{
  __asm {
    pushad
    
    mov  eax, g_DrvObj  

    mov  ecx, [eax+18h]  ; DriverExtension
    
      
    mov  ebx, [eax+34h]  ; Unload
    mov  g_Unload, ebx
    mov  ebx, MyUnload
    mov  [eax+34h], ebx
    
    mov  ebx, [eax+38h]
    mov  g_Create, ebx
    mov  ebx, MyCreateCloseCleanup
    mov  [eax+38h], ebx  ; Create
    mov  [eax+40h], ebx  ; Close
    mov  [eax+80h], ebx  ; CleanUp
      
    mov  ebx, [eax+70h]
    mov  g_DeviceControl, ebx
    mov  ebx, MyDeviceControl
    mov  [eax+70h], ebx
    
    popad

    //执行原出口代码

    __emit 0xC9 //VC6的汇编不支持leave
    retn  8
  }
}
然后,可以挂上自己的代码,开始只要PassThru就行:

代码:
VOID MyUnload( PDRIVER_OBJECT DriverObject )
{
  DbgPrint("MyUnload/n");
  ((PDRIVER_UNLOAD)g_Unload)(DriverObject);
  return;
}


NTSTATUS MyCreateCloseCleanup( PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
  DbgPrint("MyCreateCloseCleanup/n");
  return ((PDRIVER_DISPATCH)g_Create)(DeviceObject, Irp);
}


NTSTATUS MyDeviceControl( PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
  PIO_STACK_LOCATION  irpSp;
  PVOID            inputBuff, outputBuff;
      ULONG            inputLen, outputLen, ctlCode;
  NTSTATUS          Status = STATUS_UNSUCCESSFUL;
    

  irpSp = IoGetCurrentIrpStackLocation(Irp);

  // Buffered io

  inputBuff  = Irp->AssociatedIrp.SystemBuffer;
      outputBuff = Irp->AssociatedIrp.SystemBuffer;
  inputLen   = irpSp->Parameters.DeviceIoControl.InputBufferLength;
      outputLen  = irpSp->Parameters.DeviceIoControl.OutputBufferLength;
  ctlCode    = irpSp->Parameters.DeviceIoControl.IoControlCode;

  switch (ctlCode)
  {
  case IOCTL_INIT:
      //逆的代码...
      break;

  default:
      DbgPrint("DeviceControl : Not Implemented IOCTL=%08X/n", ctlCode);
      return ((PDRIVER_DISPATCH)g_DeviceControl)(DeviceObject, Irp);
      break;
  }

__End:
  Irp->IoStatus.Information = outputLen;
  Irp->IoStatus.Status = Status;
      IoCompleteRequest (Irp, IO_NO_INCREMENT);
  return Status;
}

然后,就没什么了。逆IOCTL处理代码,逐个替换。换完了,就不要这个Hook版本了,自己
实现一个完整的,当然只实现功能部分,保护的代码就不要了。加载自己的驱动站住坑,
想干啥干啥吧。

 

加载自己的驱动站住坑
很暴力哇..

if (!(*(PULONG)Entry == 0x83EC8B55 &&  *(PUCHAR)(Entry+5) == 0x14)) //检查Entry

不错 还有入口点的匹配检测
Windows驱动调试环境配置 Windows驱动调试环境配置 1 平台概述 2 虚拟机环境配置 2.1 连接设置 2.2 系统引导项设置 3 初尝驱动开发 3.1 安装WDK 3.2 新建项目 3.3 驱动开发 3.3.1 添加一个“HelloDriver.c”文件 3.3.2 修改编译选项 3.3.3 修改项目属性 4 驱动调试 4.1 启动调试 4.2 驱动服务安装 4.3 驱动服务的启动与暂 阅读详情

相关推荐

Windows驱动调试

windbg双机调试

qq_43958643的博客 2172

监视远程线程的创建[收藏]

监视远程线程的创建作者: 一块三毛钱邮件: zhongts@163.com日期: 2004.12.29    远程线程技术被大量的使用在木马、蠕虫等软件当中,通过在别的进程中插入线程的方式运行代码,具有相当高的隐蔽性。比如常见的 Explorer.exe 进程中有十几个线程同时运行,在其中插入一个线程后,谁也分辨不出来哪个就是插入的远程线程。本文提供了一种方法可以监视远程线程的创建活动,记录下来远

Purpleendurer@优快云 2325

Windows DMA驱动调试

本文记录我调试微软官方提供的一个PCI驱动sample程序的过程。 一、开发环境和资源下载 1,在win10 X64操作系统下,安装VS2015+WDK10。(参考我前面的驱动开发入门篇) 2,使用TI6655 DSP开发板,点击打开链接。 3,下载微软官方发布在github上的驱动samples,点击打开链接,选择其中的“General/PLX9x5x”这个工程。 4,参考微软关于wi

Sagittarius_Warrior的博客 5063

在LoadImageNotifyRoutine中取加载进程名

在LoadImageNotifyRoutine中有一个参数:ProcessId,如果ImageInfo->SystemModeImage的话ProcessId为0,否则为加载这个程序的ProcessId,可以通过它来取进程名:NTSTATUS GetProcessNameById(OUT PCHAR ProcessName, IN HANDLE ProcessId){ PEPROCESS...

weixin_30466953的博客 210

初级驱动调试笔记-总结

文章目录一、拿到开发板的第一步二、调试第一步 记录下基本的初级驱动调试,个人觉得初级就是不需要去修改驱动以及上层接口,修改设备树,解决gpio冲突等。 一、拿到开发板的第一步 1)找硬件工程师确定开发板板子正常。 2)找到debug串口 3)烧录镜像(首先编译过) 4)验证小系统(能不能进入kernel,是否能够在串口进行命令操作,一般来说能够在串口进行操作都可以认为是小系统ok) 5)开始调试 二、调试第一步 1)找到正确的编译和烧录方式。 2)修改对应的板级设备树文件(首先要对设备树有基础的了解) (1

永不秃头的程序员的博客 2589

MTK驱动调试深入实践指南

在当今移动设备领域中,MTK(MediaTek)处理器以其高性能和高性价比而广受欢迎。驱动程序作为连接硬件与操作系统的桥梁,其稳定性和性能对于最终用户体验至关重要。本章将介绍MTK驱动调试的基础知识,为读者提供一个全面的入门级指南。我们将从驱动调试的目的和意义开始,概述调试的一般流程以及在MTK平台上的特殊考虑。此外,本章还会提及一些在调试过程中应遵循的最佳实践,帮助开发者在面对性能瓶颈和潜在错误时,能够迅速定位问题并进行优化。调试流程一般包括问题诊断、日志分析、断点设置、代码跟踪以及性能测试等步骤。

weixin_32102617的博客 1093

驱动中使用加载回调来监控进程加载 或者DLL加载 驱动加载

 #include "ntddk.h" //#include "Ntifs.h" //PVOID NTSTATUS PsSetLoadImageNotifyRoutine(  PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTSTATUS PsRemoveLoadImageNotifyRoutine( __in PLOAD_IMAG

落笔飞花笑百生的博客 1863

易灵思FPGA实战:T35F324的PLL硬核配置全流程(附避坑指南)

本文详细解析了易灵思T35F324 FPGA中硬核PLL的配置全流程与核心避坑点。内容涵盖从架构理解、Interface Designer参数设置、VCO范围校验,到时钟网络冲突分析与动态重配置等实战环节,重点解决了引脚分配、资源约束和常见报错问题,为工程师提供了一套清晰可靠的配置指南。

u9v0w的博客 216

Windows 回调监控 <一>

在x86的体系结构中,我们常用hook关键的系统调用来达到对系统的监控,但是对于x64的结构,因为有PatchGuard的存在,对于一些系统关键点进行hook是很不稳定的,在很大几率上会导致蓝屏的发生,而且在Vista之后的操作系统中,还提供了ObRegisterCallbacks()函数注册自定义的回调对特定的对象进行监控。本文就是对在ring0经常使用的几种回调进行一个小结。 ...

weixin_30384217的博客 300

Py6S安装失败?手把手教你解决‘6S executable not found‘错误

本文详细解析了Py6S安装过程中常见的'6S executable not found'错误,提供了从MinGW-w64安装到Fortran编译器配置的完整解决方案。通过优化编译环境和进阶技巧,帮助用户高效完成大气辐射传输建模,提升科学计算效率。

x1y2z的博客 645

解密UFS Explorer:Drobo BeyondRAID数据恢复实战指南

本文详细介绍了使用UFS Explorer Professional Recovery软件中的Drobo BeyondRAID助手进行数据恢复的完整实战流程。当Drobo设备因BeyondRAID配置信息丢失而无法访问时,该工具能安全、只读地扫描硬盘,虚拟重建存储池,帮助用户找回宝贵数据。指南涵盖了从前期准备、硬盘选择、配置扫描到数据安全导出的每一步关键操作与常见问题解决方案。

weixin_29219539的博客 270

深入浅出UART驱动开发与调试:从基础调试到虚拟驱动实现

本文全面介绍了UART驱动开发与调试的关键技术和方法。首先,通过分析UART驱动中接收和发送数据的流程,展示了如何在中断函数中捕获数据,以及利用proc和sys文件系统获取串口信息。接着,深入探讨了如何实现虚拟UART驱动,包括核心数据结构、环形缓冲区设计、中断处理机制、文件操作接口以及设备树的集成方式。文章还包含详细的代码解析,展示了虚拟串口与用户空间的交互实现。

caiji0169的博客 7570

find命令

命令是 Linux/Unix 系统中用于搜索文件和目录的强大工具,支持多种搜索条件组合,并能对搜索结果执行各种操作。以下是其详细说明、常用参数及示例: 搜索路径:指定起始目录(如 、 或 表示当前目录)。 查找条件:基于文件名、类型、大小、时间等属性过滤。 处理动作:对匹配结果执行操作(如打印、删除、执行命令等)。 常用参数及示例 1. 按名称查找 :区分大小写匹配文件名。 :不区分大小写匹配文件名。 2. 按文件类型查找 :指定文件类型。 文件类型: :普通文件 :目录 :符号链接

qiao2458的博客 1138

windbg调试驱动不用替换调试机器驱动的方法

.kdfiles

danxuezx的专栏 714

修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案

1.问题描述:开机电脑显示“无法登陆到你的账户:通常可以通过从你的账户注销,然后重新登陆来解决问题,如果不立即注销,你创建的任何文件或进行的任何更改都将会丢失。” 2.问题原因:想要修改cmd中的用户名(红色部分),修改了注册表,重启时出现问题。 3.问题解决: win+R输入cmd,确定进入注册表界面,将下面的地址复制进地址栏(你也可以自己按目录查找),双击ProfileImage...

qq_33835957的博客 7万+

海洋科学—物理海洋学 第五章 海洋环流

本章是基于《海洋科学导论》,但里面涉及到的重要的公式推导是专门拎出来推的,主要借鉴董昌明老师的《物理海洋学导论》,其中有一些多出来的推导,会在更新完整个物理海洋学之后重新拿出来一一讲解,最后开一个番外篇

qq_58518586的博客 1万+

MTK驱动调试相关总结资料:掌握驱动调试的艺术

MTK驱动调试相关总结资料:掌握驱动调试的艺术 【下载地址】MTK驱动调试相关总结资料 这是一份专为MTK平台开发者打造的驱动调试宝典,涵盖了从SIM卡、T卡到FLASH、按键、IO配置等20多个关键模块的调试指南。无论你是处理FM驱动、蓝牙调试,还是解决触摸屏、传感器问题,这份资料都能提供详尽的步骤和实用技巧。它还深入...

gitblog_06792的博客 411

归结法证明真题分析

本文主要探讨了逻辑证明题的三种核心形式及其解题策略。第一类为A1∧A2∧A3→B的证明,常采用线性、单元、支持策略法等归结法,典型案例包括使用归纳法证明特定逻辑公式,并列举了历年真题。第二类为集合交集证明,典型案例为证明任意集合S和T的交集S∩T是S的子集,需将交集和包含关系用逻辑式表达。第三类为常规归结法证明,真题示例为使用归结法证明特定逻辑蕴含关系。掌握前两类证明方法后,第三类问题自然迎刃而解。

super_mochi1 280

驱动调试的一点总结

驱动开发

嵌入式与人工智能 1139

【YOLOv11】087、YOLOv11多任务学习:检测、分割、分类联合学习

摘要: 工业质检场景中,多任务模型(检测、分类、分割)的需求日益增长。针对边缘设备部署的挑战,本文提出基于YOLOv11的多任务学习方案。通过共享主干网络和设计分支头(检测、分割、分类),实现高效推理;采用动态权重平衡策略解决多任务损失不平衡问题;并优化数据流处理(支持部分标注)和推理剪裁(按需启用分支)。实验表明,该方法在Jetson Orin上帧率提升3倍,内存占用减少40%,为工业质检提供了轻量高效的解决方案。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 448

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Linux】设备驱动的调试指南

/ 设备状态调试是Linux设备驱动开发过程中的重要环节。通过合理使用调试工具和技术,开发者可以有效地定位和解决驱动程序中的问题。本文详细介绍了Linux设备驱动的调试方法,包括调试信息记录、内核模块的调试技巧及内核崩溃时的调试策略。希望上述内容能帮助读者更好地理解和掌握Linux设备驱动的调试技巧,提升驱动程序的质量。在实际开发中,可以根据具体的需求灵活运用这些调试方法,确保驱动程序的稳定性和可靠性。

极客代码 2253

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

驱动调试记录

这是前段时间做驱动时碰到的一些问题,总结了下,供以后参考。1、调试时当断点找不到相对应的源文件时,     1、在DriverEntry开头中加入_asm{int 3};即可     2、在windbg中设置符号文件、源文件和镜像文件的路径     3、注意inf文件中的名字和sys文件名是否一致(这个不太清楚)     4、注意系统加载的驱动是否就是我们自己的驱动,最好每次加载新的驱动时,删除所有以前的驱动,确保系统 找不到,弹出手动加载驱动。备注:当原因是第四点时,很有可能会出现蓝屏的情况,下午再试试。

wcjy07220114的专栏 2925

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Windbg无源码调试驱动

文章目录准备工具修改OEP修改校验和开始调试 准备工具 windbg调试器 一台搭建好双机调试环境的虚拟机 任意一个能运行驱动的软件 CFF Explorer LoadPE 修改OEP 首先随便找一个驱动文件,我就直接用Everything搜索一个 接着把文件脱到CFF,找到OEP 接下来,将RVA转成FOA 然后把OEP修改为CC,保存文件 修改校验和 修改完成之后,记得还要修改校验...

鬼手的博客 1365

MTK驱动调试相关总结资料

MTK驱动调试相关总结资料 【下载地址】MTK驱动调试相关总结资料 这是一份专为MTK平台开发者打造的驱动调试宝典,涵盖了从SIM卡、T卡到FLASH、按键、IO配置等20多个关键模块的调试指南。无论你是处理FM驱动、蓝牙调试,还是解决触摸屏、传感器问题,这份资料都能提供详尽的步骤和实用技巧。它还深入探讨了音频、电源管理...

gitblog_06761的博客 748

Linux驱动调试方法

嵌入式系统,Linux,调试

propor的专栏 3082

linux驱动调试方法

linux驱动调试方法 声明: 文章的内容来自于韦东山老师的第二期驱动视频中的驱动调试一章。 第一次写博客,写的目的是为了将自己的所学的东西记录下来,防止像以前一样学了就忘了。内容写的乱七八糟,主要是为了以后看的时候有个印象 ,内容可能会有很多错误,欢迎指正。下面就是具体内容: 驱动程序的调试的方法: 打印: printk,自制proc文件 1.1 打印 启动开发板,进入u-boot prin...

qq_38493139的博客 5235
上一篇: pe infect --扫雷里插入代码
下一篇: Ansi、Unicode、UTF8字符串之间的转换,wprintf
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值