static co_rc_t co_os_file_block_detect_size_harddisk(HANDLE handle, unsigned long long *out_size) { GET_LENGTH_INFORMATION length; IO_STATUS_BLOCK block; NTSTATUS status; length.Length.QuadPart = 0; status = ZwDeviceIoControlFile(handle, NULL, NULL, NULL, &block, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &length, sizeof(length)); if (status == STATUS_SUCCESS) { *out_size = length.Length.QuadPart; co_debug("returned size: %llu KBs", (*out_size >> 10)); return CO_RC(OK); }
// // Queries the specified disk drive for it's geometry information. // NTSTATUS _stdcall BkGetDriveGeometry( PUNICODE_STRING DriveName, PVOID pDriveGeo ) { NTSTATUS ntStatus; HANDLE hDevice; OBJECT_ATTRIBUTES oa; IO_STATUS_BLOCK IoStatus; PDISK_GEOMETRY pDG = (PDISK_GEOMETRY)pDriveGeo; InitializeObjectAttributes(&oa, DriveName, OBJ_CASE_INSENSITIVE, NULL, NULL); ntStatus = ZwCreateFile(&hDevice, GENERIC_READ | SYNCHRONIZE, &oa, &IoStatus, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); if (NT_SUCCESS(ntStatus)) { ntStatus = ZwDeviceIoControlFile(hDevice, 0, NULL, NULL, &IoStatus, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, pDG, sizeof(DISK_GEOMETRY)); ZwClose(hDevice); } // if (NT_SUCCESS(ntStatus)) return (ntStatus); }
void dc_fsf_connect() { IO_STATUS_BLOCK iosb; fsf_functl ioctl; NTSTATUS status; HANDLE h_dev; h_dev = io_open_device(DC_FSF_DEVICE_NAME); if (h_dev != NULL) { ioctl.get_flags = dc_get_hook_flags; ioctl.set_flags = NULL; status = ZwDeviceIoControlFile( h_dev, NULL, NULL, NULL, &iosb, DC_FSF_FUNCTL, &ioctl, sizeof(ioctl), &ioctl, sizeof(ioctl)); if (NT_SUCCESS(status) != FALSE) { fsf_set_flags = ioctl.set_flags; fsf_set_conf = ioctl.set_conf; } ZwClose(h_dev); } }
NTSTATUS ImScsiGetDiskSize( __in HANDLE FileHandle, __out __deref PIO_STATUS_BLOCK IoStatus, __inout __deref PLARGE_INTEGER DiskSize) { NTSTATUS status; { FILE_STANDARD_INFORMATION file_standard; status = ZwQueryInformationFile(FileHandle, IoStatus, &file_standard, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); if (NT_SUCCESS(status)) { *DiskSize = file_standard.EndOfFile; return status; } KdPrint(("PhDskMnt::FileStandardInformation not supported for " "target device. %#x\n", status)); } // Retry with IOCTL_DISK_GET_LENGTH_INFO instead { GET_LENGTH_INFORMATION part_info = { 0 }; status = ZwDeviceIoControlFile(FileHandle, NULL, NULL, NULL, IoStatus, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &part_info, sizeof(part_info)); if (status == STATUS_PENDING) { ZwWaitForSingleObject(FileHandle, FALSE, NULL); status = IoStatus->Status; } if (NT_SUCCESS(status)) { *DiskSize = part_info.Length; return status; } KdPrint(("PhDskMnt::IOCTL_DISK_GET_LENGTH_INFO not supported " "for target device. %#x\n", status)); } // Retry with IOCTL_DISK_GET_PARTITION_INFO instead { PARTITION_INFORMATION part_info = { 0 }; status = ZwDeviceIoControlFile(FileHandle, NULL, NULL, NULL, IoStatus, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, &part_info, sizeof(part_info)); if (status == STATUS_PENDING) { ZwWaitForSingleObject(FileHandle, FALSE, NULL); status = IoStatus->Status; } if (NT_SUCCESS(status)) { *DiskSize = part_info.PartitionLength; return status; } KdPrint(("PhDskMnt::IOCTL_DISK_GET_PARTITION_INFO not supported " "for target device. %#x\n", status)); } return status; }
NTSTATUS NbiBind( IN PDEVICE Device, IN PCONFIG Config ) /*++ Routine Description: This routine binds the Netbios module of ISN to the IPX module, which provides the NDIS binding services. Arguments: Device - Pointer to the Netbios device. Config - Pointer to the configuration information. Return Value: The function value is the final status from the initialization operation. --*/ { NTSTATUS Status; IO_STATUS_BLOCK IoStatusBlock; OBJECT_ATTRIBUTES ObjectAttributes; /* union { IPX_INTERNAL_BIND_INPUT Input; IPX_INTERNAL_BIND_OUTPUT Output; } Bind; */ InitializeObjectAttributes( &ObjectAttributes, &Config->BindName, OBJ_CASE_INSENSITIVE, NULL, NULL); Status = ZwCreateFile( &Device->BindHandle, SYNCHRONIZE | GENERIC_READ, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0L); if (!NT_SUCCESS(Status)) { NB_DEBUG (BIND, ("Could not open IPX (%ws) %lx\n", Config->BindName.Buffer, Status)); NbiWriteGeneralErrorLog( Device, EVENT_TRANSPORT_ADAPTER_NOT_FOUND, 1, Status, Config->BindName.Buffer, 0, NULL); return Status; } // // Fill in our bind data. // #if defined(_PNP_POWER) Device->BindInput.Version = ISN_VERSION; #else Device->BindInput.Version = 1; #endif _PNP_POWER Device->BindInput.Identifier = IDENTIFIER_NB; Device->BindInput.BroadcastEnable = TRUE; Device->BindInput.LookaheadRequired = 192; Device->BindInput.ProtocolOptions = 0; Device->BindInput.ReceiveHandler = NbiReceive; Device->BindInput.ReceiveCompleteHandler = NbiReceiveComplete; Device->BindInput.StatusHandler = NbiStatus; Device->BindInput.SendCompleteHandler = NbiSendComplete; Device->BindInput.TransferDataCompleteHandler = NbiTransferDataComplete; Device->BindInput.FindRouteCompleteHandler = NbiFindRouteComplete; Device->BindInput.LineUpHandler = NbiLineUp; Device->BindInput.LineDownHandler = NbiLineDown; Device->BindInput.ScheduleRouteHandler = NULL; #if defined(_PNP_POWER) Device->BindInput.PnPHandler = NbiPnPNotification; #endif _PNP_POWER Status = ZwDeviceIoControlFile( Device->BindHandle, // HANDLE to File NULL, // HANDLE to Event NULL, // ApcRoutine NULL, // ApcContext &IoStatusBlock, // IO_STATUS_BLOCK IOCTL_IPX_INTERNAL_BIND, // IoControlCode &Device->BindInput, // Input Buffer sizeof(Device->BindInput), // Input Buffer Length &Device->Bind, // OutputBuffer sizeof(Device->Bind)); // OutputBufferLength // // We open synchronous, so this shouldn't happen. // CTEAssert (Status != STATUS_PENDING); // // Save the bind data. // if (Status == STATUS_SUCCESS) { NB_DEBUG2 (BIND, ("Successfully bound to IPX (%ws)\n", Config->BindName.Buffer)); // RtlCopyMemory (&Device->Bind, &Bind.Output, sizeof(IPX_INTERNAL_BIND_OUTPUT)); #if !defined(_PNP_POWER) RtlZeroMemory (Device->ReservedNetbiosName, 16); RtlCopyMemory (&Device->ReservedNetbiosName[10], Device->Bind.Node, 6); Status = (*Device->Bind.QueryHandler)( // BUGBUG: Check return code IPX_QUERY_MAXIMUM_NIC_ID, (USHORT)0, &Device->MaximumNicId, sizeof(Device->MaximumNicId), NULL); CTEAssert (Status == STATUS_SUCCESS); #endif !_PNP_POWER } else { NB_DEBUG (BIND, ("Could not bind to IPX (%ws) %lx\n", Config->BindName.Buffer, Status)); NbiWriteGeneralErrorLog( Device, EVENT_TRANSPORT_BINDING_FAILED, 1, Status, Config->BindName.Buffer, 0, NULL); ZwClose(Device->BindHandle); } return Status; } /* NbiBind */
////////////////////////////////////////////////////////////////////////// //如果提供的缓存区不够大,返回STATUS_BUFFER_TOO_SMALL NTSTATUS GetAdapterInfo(ADAPTER_INFOEX *pAIEX, PULONG Size2Take) { NTSTATUS status; HANDLE hAdapter = NULL; PKEY_FULL_INFORMATION pKeyFullInfo = NULL; ULONG uTmp; ULONG uCounter=0; do { // UNICODE_STRING ustrAdapter = UNICODE_STRING_CONST(L";\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}";); UNICODE_STRING ustrAdapter = UNICODE_STRING_CONST(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Adapters"); OBJECT_ATTRIBUTES ObjAttrib; ULONG nSize; ULONG nIndex; InitializeObjectAttributes(&ObjAttrib, &ustrAdapter, OBJ_CASE_INSENSITIVE, NULL, NULL); status = ZwOpenKey(&hAdapter, KEY_READ, &ObjAttrib); if (!NT_SUCCESS(status)) { //DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"ZwOpenKey Error: %x\n", status); break; } ZwQueryKey(hAdapter, KeyFullInformation, NULL, 0, &nSize); pKeyFullInfo = (PKEY_FULL_INFORMATION)kmalloc( nSize); if (!pKeyFullInfo) { status = STATUS_INSUFFICIENT_RESOURCES; break; } status = ZwQueryKey(hAdapter, KeyFullInformation, pKeyFullInfo, nSize, &nSize); if (!NT_SUCCESS(status)) { //DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwQueryKey Error: %x\n", status); break; } if (pAIEX==NULL) { status = STATUS_BUFFER_TOO_SMALL; *Size2Take = pKeyFullInfo->SubKeys*sizeof(ADAPTER_INFO)+sizeof(ULONG); break; } for (nIndex = 0; nIndex< pKeyFullInfo->SubKeys; nIndex ++) { PKEY_BASIC_INFORMATION pKeyBasicInfo = NULL; HANDLE hDev = NULL; pKeyBasicInfo = NULL; do { UNICODE_STRING strKeyName; UNICODE_STRING ustrDev ;// UNICODE_STRING_CONST(DEV_DOS_ROOT L"{F6ACFAC2-D39E-4A43-A320-0CDB9E22B15B}"); IO_STATUS_BLOCK IoStatusBlock; ULONG nOid; ZwEnumerateKey(hAdapter, nIndex, KeyBasicInformation, NULL, 0, &nSize); pKeyBasicInfo = (PKEY_BASIC_INFORMATION) kmalloc(nSize); if (NULL == pKeyBasicInfo) { status = STATUS_INSUFFICIENT_RESOURCES; break; } status = ZwEnumerateKey(hAdapter, nIndex, KeyBasicInformation, pKeyBasicInfo, nSize, &nSize); if (!NT_SUCCESS(status)) { kprintf("ZwEnumerateKey fail \n"); break; } strKeyName.Buffer = pKeyBasicInfo->Name; strKeyName.MaximumLength = (USHORT)pKeyBasicInfo->NameLength; strKeyName.Length = (USHORT)pKeyBasicInfo->NameLength; ustrDev.Buffer = kmalloc(strKeyName.MaximumLength+sizeof(DEV_DOS_ROOT)); ustrDev.MaximumLength = strKeyName.MaximumLength+sizeof(DEV_DOS_ROOT); ustrDev.Length = 0; if (NULL == ustrDev.Buffer) { status = STATUS_INSUFFICIENT_RESOURCES; break; } RtlAppendUnicodeToString(&ustrDev, DEV_DOS_ROOT); status = RtlAppendUnicodeStringToString(&ustrDev, &strKeyName); if (STATUS_SUCCESS != status) { //DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";RtlAppendUnicodeStringToString Error: %x\n", status); kfree(ustrDev.Buffer); break; } InitializeObjectAttributes(&ObjAttrib, &ustrDev, OBJ_CASE_INSENSITIVE, NULL, NULL); status = ZwOpenFile(&hDev, GENERIC_READ, &ObjAttrib, &IoStatusBlock, FILE_SHARE_READ, FILE_NON_DIRECTORY_FILE); if (STATUS_SUCCESS != status) { //DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwOpenFile %wZ,Error: %x\n", &ustrDev, status); kfree(ustrDev.Buffer); break; } // nOid = OID_GEN_MEDIA_IN_USE; // nOid = OID_GEN_PHYSICAL_MEDIUM; //网卡类型 // uTmp = sizeof(uTmp); // status = ZwDeviceIoControlFile(hDev, // NULL, // NULL, // NULL, // &IoStatusBlock, // IOCTL_NDIS_QUERY_GLOBAL_STATS, // &nOid, // sizeof(nOid), // &uTmp, // uTmp); // if (STATUS_SUCCESS != status) // { // DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwDeviceIoControlFile OID_GEN_PHYSICAL_MEDIUM Error: 0X%x\n", status); // uTmp = -1; // if (status==STATUS_INVALID_PARAMETER) // { // // NdisPhysicalMediumUnspecified // } // // break; // } //其实这里应该先发OID_GEN_MEDIA_IN_USE获取下media类型 nOid = OID_GEN_MEDIA_CONNECT_STATUS; //网卡类型 uTmp = sizeof(uTmp); status = ZwDeviceIoControlFile(hDev, NULL, NULL, NULL, &IoStatusBlock, IOCTL_NDIS_QUERY_GLOBAL_STATS, &nOid, sizeof(nOid), &uTmp, uTmp); if (STATUS_SUCCESS != status) { //DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwDeviceIoControlFile OID_GEN_MEDIA_CONNECT_STATUS Error: 0X%x\n", status); uTmp = NdisMediaStateDisconnected; // break; } pAIEX->pAI[uCounter].status = uTmp; kprintf(" %wZ, OID_GEN_MEDIA_CONNECT_STATUS %s \n", &ustrDev, uTmp == NdisMediaStateConnected ? "Connected" : "Disconnected"); kfree(ustrDev.Buffer); uTmp = sizeof(pAIEX->pAI[uCounter].macAddress); nOid = OID_802_3_CURRENT_ADDRESS; status = ZwDeviceIoControlFile(hDev, NULL, NULL, NULL, &IoStatusBlock, IOCTL_NDIS_QUERY_GLOBAL_STATS, &nOid, sizeof(nOid), pAIEX->pAI[uCounter].macAddress, uTmp); if (STATUS_SUCCESS != status) { //DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,";ZwDeviceIoControlFile OID_802_3_PERMANENT_ADDRESS Error: 0x%x\n", status); break; } //DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"Mac: %02X:%02X:%02X:%02X:%02X:%02X\n", pAIEX->pAI[uCounter].macAddress[0], pAIEX->pAI[uCounter].macAddress[1], pAIEX->pAI[uCounter].macAddress[2], pAIEX->pAI[uCounter].macAddress[3], pAIEX->pAI[uCounter].macAddress[4], pAIEX->pAI[uCounter].macAddress[5]); pAIEX->pAI[uCounter].GUID.Buffer = kmalloc(pKeyBasicInfo->NameLength); pAIEX->pAI[uCounter].GUID.Length = pAIEX->pAI[uCounter].GUID.MaximumLength = (USHORT)pKeyBasicInfo->NameLength; RtlCopyMemory(pAIEX->pAI[uCounter].GUID.Buffer, pKeyBasicInfo->Name, pKeyBasicInfo->NameLength); if (1) { CHAR IPAddress[48]; ANSI_STRING aniString; UNICODE_STRING uniString; char *pTmp=NULL; UNICODE_STRING ustrAdapterInfo = UNICODE_STRING_CONST(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"); WCHAR *pPath =kmalloc(ustrAdapterInfo.Length+pKeyBasicInfo->NameLength+2); RtlZeroMemory(pPath, ustrAdapterInfo.Length+pKeyBasicInfo->NameLength+2); RtlCopyMemory(pPath, ustrAdapterInfo.Buffer, ustrAdapterInfo.Length); pTmp = (char*)pPath; RtlCopyMemory(&pTmp[ustrAdapterInfo.Length], pKeyBasicInfo->Name, pKeyBasicInfo->NameLength); uTmp=0; uTmp = sizeof(ULONG); status = KKGetKeyValue(pPath, L"EnableDHCP", &uTmp, &uTmp); if (NT_SUCCESS(status)) { RtlZeroMemory(IPAddress, sizeof(IPAddress)); //开启了DHCP情况 if (uTmp==1) { pAIEX->pAI[uCounter].bDhcp = TRUE; //够长了,应该会自动截断 RtlZeroMemory(IPAddress, sizeof(IPAddress)); uTmp = sizeof(IPAddress); status = KKGetKeyValue(pPath, L"DhcpIPAddress", IPAddress, &uTmp); if (NT_SUCCESS(status)) { RtlInitUnicodeString(&uniString, (WCHAR*)IPAddress); RtlUnicodeStringToAnsiString(&aniString, &uniString, TRUE); RtlZeroMemory(IPAddress, sizeof(IPAddress)); RtlCopyMemory(IPAddress, aniString.Buffer, aniString.Length); pAIEX->pAI[uCounter].IPAddr = inet_addr(IPAddress); RtlFreeAnsiString(&aniString); } else { kprintf("fail 2 get DhcpIPAddress\n"); } RtlZeroMemory(IPAddress, sizeof(IPAddress)); uTmp = sizeof(IPAddress); status = KKGetKeyValue(pPath, L"DhcpDefaultGateway", IPAddress, &uTmp); if (NT_SUCCESS(status)) { RtlInitUnicodeString(&uniString, (WCHAR*)IPAddress); RtlUnicodeStringToAnsiString(&aniString, &uniString, TRUE); RtlZeroMemory(IPAddress, sizeof(IPAddress)); RtlCopyMemory(IPAddress, aniString.Buffer, aniString.Length); pAIEX->pAI[uCounter].GatewayIpAddr = inet_addr(IPAddress); RtlFreeAnsiString(&aniString); } else { kprintf("fail 2 get DhcpDefaultGateway\n"); } }//if (uTmp==1) else { pAIEX->pAI[uCounter].bDhcp = FALSE; //够长了,应该会自动截断 RtlZeroMemory(IPAddress, sizeof(IPAddress)); uTmp = sizeof(IPAddress); status = KKGetKeyValue(pPath, L"IPAddress", IPAddress, &uTmp); if (NT_SUCCESS(status)) { RtlInitUnicodeString(&uniString, (WCHAR*)IPAddress); RtlUnicodeStringToAnsiString(&aniString, &uniString, TRUE); RtlZeroMemory(IPAddress, sizeof(IPAddress)); RtlCopyMemory(IPAddress, aniString.Buffer, aniString.Length); pAIEX->pAI[uCounter].IPAddr = inet_addr(IPAddress); RtlFreeAnsiString(&aniString); } else { kprintf("fail 2 get IPAddress\n"); } RtlZeroMemory(IPAddress, sizeof(IPAddress)); uTmp = sizeof(IPAddress); status = KKGetKeyValue(pPath, L"DefaultGateway", IPAddress, &uTmp); if (NT_SUCCESS(status)) { RtlInitUnicodeString(&uniString, (WCHAR*)IPAddress); RtlUnicodeStringToAnsiString(&aniString, &uniString, TRUE); RtlZeroMemory(IPAddress, sizeof(IPAddress)); RtlCopyMemory(IPAddress, aniString.Buffer, aniString.Length); pAIEX->pAI[uCounter].GatewayIpAddr = inet_addr(IPAddress); RtlFreeAnsiString(&aniString); } else { kprintf("fail 2 get DefaultGateway\n"); } } }// end status = QueryRegistryValue(pPath, L"EnableDHCP if (pPath) { kfree(pPath);pPath=NULL; } } uCounter++; pAIEX->uNumber = uCounter; }while(0); if (hDev) { ZwClose(hDev); } if (pKeyBasicInfo) { kfree(pKeyBasicInfo); } if (STATUS_SUCCESS == status) { // break; } } }while(0); if (pKeyFullInfo) { kfree(pKeyFullInfo); } if (hAdapter) { ZwClose(hAdapter); } return status; }