2012-03-02 07:47:23 liumangxiong 阅读数 2101
驱动是机器代码级的,不需解释的。C#编译后的代码是解释级的,根本不能在驱动级工作,除非微软愿意将解释器搞到驱动级。市面上有所谓的.Net驱动程序开发,但不过是个幌子,还是用C/C++开发的,能不能用某种语言编写,取决于ddk编译器是否支持。目前微软提供的DDK编译器只支持汇编/C/C++。另外C#是CLR格式的,驱动还是PE格式的。
2013-05-16 23:21:52 chenchong_219 阅读数 1055

1、mini_ddk.c

#include <ntddk.h>

VOID DriverUnload(PDRIVER_OBJECT dirver)
{
DbgPrint("First:our Driver is unloading.....\n");
}


NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
//这里只输出一句话
DbgPrint("first: Hello,my salary!");
//设置一个卸载函数,便于这个函数的退出
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}


2、Sources

TARGETNAME=mini_ddk
TARGETTYPE=DRIVER
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)\inc;\
         $(BASEDIR)\inc\ddk;\

SOURCES=mini_ddk.c\


3、makefile

#
# DO NOT EDIT THIS FILE!!!  Edit .\sources. If you want to add a new source
# file to this component.  This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)\makefile.def


2016-10-14 23:50:12 KoalaZB 阅读数 3456

C/C++编程解析硬盘分区信息

人狠话不多,直接上代码:

#include <windows.h>
#include <winioctl.h> //DDK驱动开发与控制
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define BufferLength 1024

//将四个连续字节存放的值转为int型
int transtoint(unsigned char a[])
			{
				int sum = 0;
				for(int i=0;i<4;i++){
					int m = a[i]/16;
					int n = a[i]%16;
					float len =16;
					//printf(" %d %d ",m,n);
					int temp1 = m*(pow(len,7-2*i));
					int temp2 = n*(pow(len,6-2*i));
					//printf(" %d ",temp);
					sum = sum+temp1+temp2;
				}
				return sum;
			}
//十六进制输出
void HexOutput(char* buf, size_t len)   
{ 
	unsigned char a = buf[0];
	printf("第一字节是:%x\n\n",a);
	printf("          第一部分(引导代码):\n\n");
	int flag = 0;
    for(size_t i=0; i<len; ++i)   
    {   
        unsigned char c = buf[i]; // must use unsigned char to print >128 value 
  
		flag++;
        if( c< 16)   
            printf("0%x ", c);     
        else    
            printf("%x ", c); 
  
		if (i == 445)
		{
			flag=0;
			printf("\n\n          第二部分(分区表):\n");
		}

		if (i == 509)
		{
			flag=0;
			printf("\n\n          第三部分(结束标志):\n");
		}
		if ((flag)%16 == 0)
			printf("\n");
    }

	printf("\n<-------------------分区表信息解析------------------->\n\n");
	printf("\n\n分区地址和大小分别为: \n\n");
	
	for(int m=445,rank=1;m<509;m+=16,rank++)
	{
		
		unsigned char fifth = buf[m+6];//取得第五位标志位
		if(fifth<16) //调整输出格式
			printf("第%d分区表标志位为: 0%x\n",rank,fifth);
		else 
			printf("第%d分区表标志位为: %x\n",rank,fifth);
		if(fifth == 0x00)//当第五位(标志位)是00时,代表分区表信息为空,无分区
		{
			printf(" 分区表为空\n\n");
		}
		else{
			unsigned char offsetadd[20]={0};
			printf("地址:");
			for(int n=m+12,t=0;n>m+8,t<4;n--,t++)
			{
				unsigned char temp = buf[n];
				if(temp<16)
					printf("  0%x  ",temp);
				else
					printf("  %x  ",temp);
				offsetadd[t] = buf[n];
			}
			//计算地址,转换为十进制扇区数LBA
			printf("\n");
			int tempadd = transtoint(offsetadd);
			printf("\n地址为: %d",tempadd);
			printf("\n\n");
			printf("大小:");
			for(int p=m+16,w=0;p>m+12,w<4;p--,w++)
			{
				unsigned char temp1 = buf[p];
				if(temp1<16)
					printf("  0%x  ",temp1);
				else
					printf("  %x  ",temp1);
				offsetadd[w] = buf[p];
			}
			//计算大小,转化为GB单位
			printf("\n");
			int tempsize = transtoint(offsetadd);
			printf("\n大小为: %d 扇区 = %d GB \n",tempsize,tempsize/2/1024/1024);
		}
		
		
	}
    printf("\n\n");   
}  

//函数:对主分区表进行解析,分别得到每个分区的偏移地址以及分区大小

BOOL GetDriveGeometry(DISK_GEOMETRY *pdg,int addr)
{
	HANDLE hDevice;               // 设备句柄
	BOOL bResult;                 // results flag
	DWORD junk;                   // discard resultscc
	char lpBuffer[BufferLength] = {0};


//通过CreateFile来获得设备的句柄
	hDevice = CreateFile(TEXT("\\\\.\\PhysicalDrive0"), // 设备名称,这里指第一块硬盘
						GENERIC_READ,                // no access to the drive
						FILE_SHARE_READ | FILE_SHARE_WRITE,  // share mode
						NULL,             // default security attributes
						OPEN_EXISTING,    // disposition
						0,                // file attributes
						NULL);            // do not copy file attributes
	if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
	{
		return (FALSE);
	}

//通过DeviceIoControl函数与设备进行IO
	bResult = DeviceIoControl(hDevice, // 设备的句柄
							  IOCTL_DISK_GET_DRIVE_GEOMETRY, // 控制码,指明设备的类型
								NULL, 0, // no input buffer
								pdg, 
								sizeof(*pdg),     // output buffer 输出,保存磁盘参数信息
								&junk,                 // # bytes returned
								(LPOVERLAPPED) NULL); // synchronous I/O
//主引导扇区的位置为0柱面0磁头1扇区
	//int BlockAddr = ( 0 * 256 + 0 ) * 63 + 1 - 1; //计算绝对地址
	//SetFilePointer(hDevice, (BlockAddr*512), NULL, FILE_BEGIN);
	LARGE_INTEGER offset;
	offset.QuadPart = (ULONGLONG)addr * (ULONGLONG)512;
	SetFilePointer(hDevice,offset.LowPart,&offset.HighPart,FILE_BEGIN);
	printf("错误类型代号:%ld\n\n",GetLastError());
    DWORD dwCB;
    BOOL bRet = ReadFile(hDevice,lpBuffer,512,&dwCB,NULL);
	//printf("%x\n\n",lpBuffer);
    HexOutput(lpBuffer,512);


	CloseHandle(hDevice);

	return bResult;
}
extern int add[20];
extern int disknum;
int main()
{
	DISK_GEOMETRY pdg;            // 保存磁盘参数的结构体
	BOOL bResult;                 // generic results flag
	ULONGLONG DiskSize;           // size of the drive, in bytes
	printf("<-----------------欢迎使用分区读取程序----------------->\n\n");
	bResult = GetDriveGeometry (&pdg,0);

	if (bResult) 
	{
		printf("柱面数 = %I64d\n", pdg.Cylinders); //柱面数
		printf("每柱面的磁道数 = %ld\n", (ULONG) pdg.TracksPerCylinder);//每柱面的磁道数
		printf("每磁道扇区数 = %ld\n", (ULONG) pdg.SectorsPerTrack);//每磁道扇区数
		printf("每扇区的字节数 = %ld\n", (ULONG) pdg.BytesPerSector); //每扇区的字节数
  
		DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
					(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
  
		printf("磁盘大小 = %I64d (Bytes) = %I64d (Gb)\n", DiskSize,DiskSize / (1024 * 1024 * 1024));
	} 
	else 
	{
		printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
	}
	system("pause");
	return ((int)bResult);
}

运行结果类似于:
主分区
主分区
主分区
总硬盘

2009-05-16 11:15:00 Augusdi 阅读数 1871

Visual C++开发设备驱动程序的注意事项

       简单的说,使用Makefile项目来创建设备驱动程序的过程就是在Visual C++中调用DDK命令的过程,其与DDK命令提示窗口的执行顺序完全一样,驱动程序的可执行文件也被存放在同一个目录中。他们之间的区别只是一个在DDK的命令提示窗口,一个在Visual C++的集成开发环境中调用这些命令罢了。但其与使用Visual C++开发Win32有那个用程序有本子的不同,他没有窗口消息和消息需要处理,也不能编译单个原代码文件,且无法直接运行起可执行文件。

       总之,在使用Makefile项目开发设备驱动程序时,一定要注意以下几点:

1在向Makefile项目添加或删除文件时,必须修改相应sources文件总的SOURCES宏,以使BUILD工具能正确识别所需编译、连接的驱动程序源文件。

2如需生成源代码的浏览信息,一定要在其sources文件中添加下面这条语句

BROUSE_INFO=1

3Makefile项目中无法编译单个驱动程序源文件,也无法直接运行其可执行文件,即不能执行Visual C++的“Build Compile XXX”和“Build/Execute”菜单项。同时也无法使用Visual C++的调试手段,因为他们都属于系统内核模式组件。

4Windows 98中,当项目配置由“Win32 Free”转为“Win32 Checked”时,以帝国要执行Visual c++的“Build/Rebuild All”菜单项,已重新编译所有的驱动程序源文件。当在Windows 2000中发生这种情况时,不需要尽心去不重新构建。

 

2012-09-29 15:03:40 kaizi318 阅读数 4779

  读windows驱动开发技术详解 后笔记

WINDOWS驱动开发查看和调试工具

softice
windbg
objview
devicetree

// WINDDK WDK 笔记
TARGETNAME :目标驱动的名称
TARGETTYPE:生成的类别
DDKROOT :根目录
C_DEFINES C预定义宏,相当#define
TARGETPATH: 目标代码生成路径
INCLUDES 包含目录的路径
TARGETLIBS 目标代码所需要的库
MSC_WARNING_LEVEL :警告级别
SOURCES:工程所需要的源文件

bulid工具的环境变量
BASEDIR :指定驱动目录的基准,默认为DDK的根目录
BULID_DEFAULT:设置默认参数
BULID_DEFAULT_TARGETS 设置默认的编译目标平台
BULID_MAKE_PROGRAM:设置makefile的文件名

没有更多推荐了,返回首页