elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 1254
81  Foros Generales / Dudas Generales / Re: ¿Qué es un archivo .nsm? en: 21 Marzo 2025, 19:17 pm
¿Cómo averiguo qué es?

En Unix puedes usar el comando file para obtener algo de información

Prueba a utilizar el programa gratuito TrIDNet:

  • https://mark0.net/soft-tridnet-e.html

Es un identificador de tipo de archivo, basado en el análisis de coincidencias de patrones de bytes en el mismo.

Debes descargar el programa y el archivo de definiciones, que están en la misma sección de esa página web.

Posiblemente no exista otro programa similar con una base de datos más amplia (19.086 definiciones) y actualizada (19 de Marzo de 2025).

El análisis con TrIDNet te mostrará una lista de resultados, de mayor a menor coincidencia. De todas formas, a priori, se puede advertir que tu archivo podría estar relacionado con alguna de estas entradas:



Atentamente,
Elektro.
82  Foros Generales / Dudas Generales / Re: Error 8646 Windows 10 en: 21 Marzo 2025, 19:08 pm
Contexto sobre el código de error 8646:



Algo importante a tener en cuenta:

La herramienta utilman no funciona si la cuenta de Windows está vinculada a una cuenta de Microsoft.

En ese mismo hilo de Reddit, el usuario afectado por un problema como el tuyo afirma haber logrado acceso a su cuenta utilizando un "removedor de contraseñas", pero no especifica cual. Así que me da a mi que, al menos por ahora, si nadie ofrece una solución, tu mejor opción es buscar y probar hasta hallar el que funcione, empezando por las sugerencias que mencionó @Songoku.

Atentamente,
Elektro.
83  Foros Generales / Dudas Generales / Re: ¿Como se si me estan espiando? en: 21 Marzo 2025, 18:40 pm
Todos los síntomas que describes podrían deberse a uno o varios procesos en ejecución que estén acaparando y consumiendo de forma constante una cantidad demasiado exigente de recursos de tu CPU, de la RAM, o de ambas cosas. O también realizando demasiadas llamadas de escritura/lectura en el disco. Esto podría llamarse un 'cuello de botella' a nivel de recursos.

Empieza a analizar por ahí. Examina la lista de procesos activos y su consumo (CPU, RAM, IO read/write), y si notas algo sospechoso, dilo. Cierra todos aquellos procesos que no sea estrictamente necesarios mantenerlos en funcionamiento, y seguidamente observa el comportamiento de tu sistema para comprobar si hay alguna mejoría intentando realizar aquellas acciones que has descrito y que tanto se te dificultan.

Lo que ha comentado @WHK podría ser una opción que exigiría demasiada RAM en un equipo no capacitado para tener instalado Windows 10. Una CPU o una RAM insuficientes pueden causar un 'cuello de botella' a nivel de hardware, limitando el rendimiento de otros componentes de hardware, afectando al rendimiento del sistema operativo y las acciones que realices en él. Solo tú sabrás si este es el caso o no, por que imagino que quien tenga intención de instalar Windows 10 en un PC antiguo como mínimo debería haberse leído los requisitos mínimos, y si no es así, los puede encontrar en Internet para salir de dudas.

Un troyano (RAT) también podría ser la causa a tus problemas. Tanto el proceso del troyano por simple funcionamiento, como el atacante por acceso remoto a tu sistema, podrían estar consumiendo los recursos disponibles, pero primero deberías examinar lo que he dicho al principio para descartar otras posibilidades.

Sin más información por tu parte, en general sería buena idea que hagas una limpieza profunda en tu sistema, gestionando adecuadamente las entradas de los procesos de terceros que se inician con Windows, las extensiones de la shell de Windows instaladas por terceros, los procesos en segundo plano que se mantienen en ejecución, los servicios de Windows y de terceros, y usar el programa CcLeaner para limpiar archivos temporales y entradas del registro huérfanas o problemáticas.

Con el programa gratuito Autoruns de SysInternals puedes averiguar y administrar varias de estas entradas instaladas por terceros.

PD: Reinstalar Windows para devolver el sistema a su estado inicial de rendimiento, siempre y cuando te haya funcionado bien antes de tener estos problemas, tampoco sería una mala opción (resultaría lo más eficaz).

Atentamente,
Elektro.
84  Foros Generales / Dudas Generales / Re: anydesk en: 21 Marzo 2025, 18:01 pm
hola, voy a utilizar anydesk para interactuar con mis clientes. Me dicen desde anydesk que la version gratuita es solo para uso particular. ¿Sabeis si anydesk puede detectar que uso le estas dando? ¿como?

Infinidad de compañías de software que ofrecen un producto en versión gratuita y comercial, utilizan ese "Aviso legal" en su página web, pero es solo una formalidad en mi opinión dirigida más bien a empresas y oficinas que pueden pasar por inspecciones legales para determinar que todo lo tengan "en regla", como por ejemplo estar usando AnyDesk con una licencia adecuada a su tipo de uso en un lugar de trabajo.

Pero en lo que a ti respecta, y a menos que trabajes en una empresa, a un usuario particular no se van a poner a monitorizarte ni a vigilarte en general para intentar "detectar" el tipo de uso que le des. Puedes estar tranquilo. O al menos no deberían...

Y aunque la compañía tras AnyDesk tuviese funcionando un sistema para analizar la frecuencia y volumen de conexiones para intentar determinar si un usuario está haciendo un uso doméstico o empresarial de su software, ¿como leches van a acusarte por las buenas del uso que le estés dando tú en específico?, puedes ser alguien que está interactuando con gente por Internet por que quiere, para conocer gente ...usando las funciones de chat de AnyDesk, o alguien que está ayudando de forma totalmente altruista a personas con problemas en su PC. No te pueden acusar de nada sin pruebas, y el tipo de pruebas que necesitarían creo que sería ilegal tenerlas (un registro de acciones, de chat, de capturas de imagen, etc).
 
Atentamente,
Elektro.
85  Seguridad Informática / Seguridad / Re: ¿Máquina virtual o usb live? en: 17 Marzo 2025, 09:19 am
Buenas tardes tengo una duda con respecto a cuál de los dos medios es más seguro en caso de tener que abrir un archivo sospechoso o tener que navegar por alguna web que pueda ser sospechosa de ser maliciosa.
Bajo mi punto de vista me parece más seguro usar un usb live de alguna distribución en un equipo que se tenga dedicado para eso.

¿Qué pensáis vosotros? siempre en el supuesto de que esa máquina deba tener salida hacia internet.

No es una opinión discutible; usar una máquina virtual (VM) es mucho más seguro.

Un Live OS no está diseñado para funcionar como un entorno de aislamiento contra virus, por lo que te recomiendo que evites esta práctica, ya que conlleva un riesgo muy alto.

Con un Live OS (sistema operativo autoarrancable), ya sea mediante USB o CD, y ya sea de Windows o Linux, los discos conectados y el USB son accesibles, lo que deja expuestos todos tus archivos locales, lo que significa que cualquier software malicioso tendría acceso directo y sin limitaciones a todos tus archivos locales, así que nada evitaría que se propague y te infecte, a menos que la distribución de Linux en cuestión no monte automáticamente los discos (hay tantas distros y variantes que no sé si todas montan automáticamente los discos o no), pero un virus cualificado que haya pensado de forma minuciosa en esa barrera, siempre podría montar los discos locales de forma programática, cosa que no podría hacer en una VM ...a menos que sea un virus que explote alguna vulnerabilidad de día cero sin corregir en el software de virtualización, pero tampoco vamos a ponernos tan quisquillosos pensando en la posibilidad de infectarte con ese 0,0000001% de virus, ¿no?, por que si nos ponemos así, absolutamente NADA es totalmente seguro al 100% en este mundo digital.

Respecto a la mención sobre que la VM tenga acceso a internet, en realidad, eso no supone un problema. La VM te permite mantener la persistencia que necesites mediante instantáneas (snapshots), lo que te permitirá regresar a un estado anterior (rollback) en caso de infección. De este modo, aunque un virus descargue algo malicioso a través de internet, como un ransomware o un minador de criptomonedas, siempre puedes hacer un rollback a un snapshot y todo se revertiría de forma totalmente segura.

Lo que realmente importa es asegurarte de que la VM no tenga acceso a tus discos locales. Por ejemplo, en VMware, la opción de 'Carpetas Compartidas' (Shared Folders) puede crear una unidad de red local que permita acceso a tus archivos (no es necesario una conexión a Internet para esto).



Y hablando de VMWare, desarrollé estos dos scripts para montar y desmontar las 'Carpetas Compartidas' de VMWare simplemente con un click del ratón y desde el sistema huésped (guest), lo que te podrían servir si decidieses utilizar VMWare:

[APORTE] [VBS] VMWare: Mount / Unmount Shared Folders Network Drive

...Sin embargo, ten en cuenta que lo mismo que hice yo con un script, un virus podría hacerlo con fines maliciosos para propagarse. Por eso, la opción más segura al utilizar VMWare en caso de analizar archivos sospechosos no es simplemente desmontar la unidad de red, sino desactivar la característica por completo (en las opciones de VMWare) de forma temporal durante esa sesión de testing, y volver a activarla solo tras haber hecho un rollback a un snapshot libre de infecciones.

Atentamente,
Elektro.
86  Foros Generales / Sugerencias y dudas sobre el Foro / Re: ¡Es peligroso! - Solicito contactar con algún moderador global en: 14 Marzo 2025, 22:04 pm
se sabe en que sección esta?

Todos los detalles están en mi reporte, para los miembros del staff que quieran leerlo. No voy a hacer un señalamiento público.

¡Un saludo!
87  Foros Generales / Sugerencias y dudas sobre el Foro / Re: ¡Es peligroso! - Solicito contactar con algún moderador global en: 14 Marzo 2025, 02:36 am
* El sistema de reportes del foro es el mismo para todo el mundo sin importar quién es el autor del hilo reportado y quién lo reporta. Así que no veo incoveniente en que lo utilices.

El problema es que no estoy seguro de quien recibiría el reporte (¿reportar para que el reporte le llegue a ese moderador y solo a ese moderador?, sería una acción estúpida e inútil por mi parte), o de si realmente hay alguien que lo recibiese o tal vez nadie, por ser del foro en el que está el hilo en cuestión.

Como ya dije, tengo mis motivos para no hacerlo, pero aunque yo diga esto ...supongo que da igual, todo lo que yo diga siempre será motivo de crítica, siempre lo hago todo mal o de forma incorrecta al parecer, según con los ojos de quien mire mis palabras.

* Dices que no quieres hacer un señalamiento pero ya lo estás haciendo, al decir que un usuario con rango ha creado un hilo muy peligroso. Con rango solo hay 5 tipos de usuario: Colaboradores, Moderadores Globales, CoAdmin, Ex-Staff y Wiki. Y de todos esos grupos hay muy pocos miembros activos que hayan podido postear algo peligroso recientemente. Con lo cual para no querer hacer un señalamiento, estás acotando mucho el posible "infractor".

¿Se me va a cuestionar absolutamente todo lo que diga o haga? ¿Y por qué? ¿Por ser 'Elektro' y no alguien distinto, verdad? ¿Por el simple hecho de haber dejado claro que, precisamente debido al rango especial del usuario, prefiero no señalar directamente su nombre? ¿Es decir, por mostrar respeto y prudencia? ¿Por preguntar con quien puedo hablar antes de señalar? Porque, al fin y al cabo, antes tendrán que ser ustedes (mods globales y demás) quienes decidan si estoy en lo cierto o no, si mi acusación tiene fundamentos o creen que carece de ellos.

* He revisado el foro y no he visto ningún hilo que pueda ser peligroso iniciado por ningún miembro, tenga rango o no, ya que de haberlo detectado se habrían tomado medidas.

No es un mensaje reciente si lo dices por eso. Aunque el hilo sí que está muy a la vista de cualquiera, y no debería estarlo. Al menos no en su estado actual.

No sé que decirte. Eso que comentas no da ninguna validez para restarle importancia a mi reporte, y menos todavía sin conocerlo. Solo puedo decirte que quizás haga falta un moderador más para detectar mejor o con mayor rapidez este tipo de cosas, ya que un par de ojos extra siempre ayudan más al grupo. 👌

Tal vez, en lugar de dirigir tantas críticas hacia mi persona, se me debería mostrar algo de gratitud por ayudarles con mis dos lindos ojos. Tal vez. Ya sé que eso es una petición impensable, pero tal vez, un 'gracias' por una sola vez no estaría nada mal. Un agradecimiento formal por tomarme el tiempo de analizar con cierta perspectiva algo que otras personas probablemente no hayan analizado, por que se les haya pasado por alto, según das a entender en tu comentario, o por que quizás no tengan la capacidad de analizarlo con la misma perspectiva o el ojo crítico con el que lo hice yo.

Lo único que yo sé, WVB, es que, al final, sea cual sea la decisión final por parte de ustedes sobre mi reporte, lo cierto es que aquí estoy, haciendo esto, colaborando de esta forma con ustedes, intentando dar lo mejor de mi para que el foro sea un lugar más seguro para todos. Aunque nadie me lo haya pedido. Y lo hago tras haber sido y seguir siendo vetado, odiado, perseguido, criticado, insultado y despreciado.

De nada.

alarmistas

Como moderadores globales y miembros del staff que ustedes son, la preocupación que siento sobre este asunto también debería ser motivo compartido de cierta preocupación por ustedes. ¡Si a mi me preocupa de esta manera y yo no soy moderador!.

El problema, claro está, es que es imposible sentir esa misma preocupación sin entender primero que es lo que a mi me preocupa, el por qué estoy haciendo esto...

No se me debería seguir juzgando de esta manera sin conocer toda la información. ¿Acaso alguna vez he pecado de ser 'Pedro' en el cuento de 'Pedro y El Lobo'?. Yo diría que no. Si consideras que te transmito cierta sensación de alarmismo, tal vez sea por una buena razón.

El hilo que yo reporto, podría repercutirle gravemente al foro (al dueño del foro) dependiendo de las intenciones del autor del hilo. No es ninguna broma. Quiero recordarte que a mi me llegasteis a eliminar un comentario, un post, simplemente por señalar el nombre de una marca de bebidas y decir que era muy perjudicial para la salud. Por que supuestamente mi comentario difamaba a cierta compañía alimenticia y eso podría afectarle al dueño de este foro. En fin... lo de siempre, censurando cualquier cosa que diga o haga Elektro, por cualquier pretexto estúpido. En fin, no me quiero desviar del tema. Este hilo que reporto, ni te imaginas lo que podría afectar, dependiendo de las intenciones del autor del hilo, insisto. Pero esto sí le afectaría de verdad a el-brujo judicialmente hablando, en el peor de los casos, no como un comentario estúpido que yo pueda escribir en el foro libre, lugar en el que por cierto se me prohíbe participar, por que soy yo, Elektro, sin más motivo. En fin...

Si te parece bien, WVB, puedo ponerme en contacto contigo para enviarte el reporte, si me das tu permiso. Después de leer lo que tengo que decir, entonces podrás criticar lo que quieras con motivos o sin ellos, pero antes de eso, no me parece justo.



Hola!

Esto qué significa? Quieres exponer el tema públicamente o no?

Puedes enviarme un MP. Pero recuerda que todo lo hablado por MP, debe mantenerse privado (las reglas del foro prohíben publicar lo hablado por MP). De ahí mi pregunta inicial de mantener todo el tema público o privado.

A mi no me importaría si alguien con rango decide hacerlo público, esa decisión no me incumbe. Si esa persona considera que lo adecuado es hacerlo público, pues vale. Aunque no creo que fuese necesario, por que supongo que se resolvería en privado.

En principio solo se trata de eliminar un hilo, no hay por que dar nombres.

Pero evidentemente yo no debo hacerlo público. Si WVB me critica sin haber señalado, puedo imaginarme el ban que me caería por señalar... y no lo digo especialmente por WVB, sino por todos ustedes, se criticaría y se me banearia probablemente, pero es que además tendríais razón, por que lo correcto no es señalar.

Además, por que tampoco tengo pruebas de mi acusación como un papel donde esté la firma de esa persona y diga "Soy culpable", así que no me parece adecuado señalar. Pero si que tengo un razonamiento lógico que quiero exponer para que ustedes decidan.

Gracias por el ofrecimiento, me pondré en contacto contigo también, en la brevedad de lo posible.

EDITO: Reporte enviado. No sé si compartirás mis motivos y mi razonamiento, no sé que pasará con ese hilo a partir de ahora, pero estoy convencido que al menos tú, tras leer el reporte, podrás entender por que he hecho todo esto. Y me gustaría, a ser posible, que le comentes a WVB y a quien también piense que soy un alarmista, o que busco llamar la atención como me dijo otra persona del staff hace ya un tiempo, por publicar aquí en el foro de 'Sugerencias, que yo no lo hago con esa finalidad. Si necesitase atención, me buscaría una "cariñosa", jaja. Lo que hago lo hago con un argumento de peso. Y por mucho que algunos de ustedes insistan en buscar malicia, o "trolling" o llamadas de atención en mis palabras, los motivos de mi preocupación están reflejados en el reporte que he enviado.
88  Foros Generales / Sugerencias y dudas sobre el Foro / ¡Es peligroso! - Solicito contactar con algún moderador global en: 12 Marzo 2025, 04:22 am
Hola.

He detectado un hilo que en mi opinión es muy peligroso y podría estar elaborado con fines maliciosos cuestionables. En mi opinión debería ser eliminado cuanto antes. No puedo reportarlo directamente usando el botón de reportar, por motivos que me reservo publicamente.

¿Con quien puedo hablar esto?. Tendría que ser con alguien que pueda eliminar temas del foro, y por mensaje privado, por que el hilo implica a un usuario con rango así que no quiero hablarlo aquí publicamente por respeto (para evitar hacer un señalamiento público).

¿Alguien que cumpla estas características (un moderador global o con rango superior) podría ponerse en contacto conmigo, por favor?.

¿O decirme con quien debo ponerme yo en contacto?.

Esto no lo hago por mi, sino por el foro y sus usuarios.

No pretendo perjudicar a nadie, solo que escuchen mis argumentos por los cuales considero que ese hilo debería ser eliminado cuanto antes por el bien estar de los usuarios. Solo eso, que se elimine ese tema y ya, sería el fin del asunto por mi parte.

Creo que si me escuchasen podrían comprender mis argumentos e incluso darme la razón total o parcialmente.

No seré pesado ni escribiré una biblia para explayarme, lo prometo.

Gracias.
89  Foros Generales / Sugerencias y dudas sobre el Foro / Re: Cómo poner una imagen de tu perfil del foro más grande en: 12 Marzo 2025, 03:27 am
Pues eso, me gustaría saber cómo lo hacéis.

No se puede agrandar la imagen de tu avatar de forma directa. Debes redimensionarla / agrandarla de forma local, y la vuelves a subir.

Pero debes tener en cuenta esta regla del foro:
I.A.3.b. Imágenes en avatares.
    Las dimensiones de los avatares no deben ser superiores a 300x400px

Atentamente,
Elektro.
90  Programación / Scripting / [APORTE] [PowerShell] Crear un archivo dummy de forma fácil e interactiva en: 3 Marzo 2025, 09:36 am
El siguiente script, desarrollado de manera híbrida en PowerShell y VisualBasic.NET, permite crear de manera interactiva un archivo dummy (vacío o con contenido aleatorio) con un tamaño determinado.

La creación de un archivo dummy resulta útil para realizar pruebas de escritura en discos, o para sobrescribir el espacio en blanco del disco dificultando o imposibilitando la recuperación de datos, por ejemplo, generando un archivo dummy (con datos aleatorios) que ocupe todo el espacio disponible en el disco.

Al ejecutar este script, aparecerá el siguiente formulario que permitirá seleccionar la ubicación del archivo a crear y configurar las opciones disponibles:



Este es el procedimiento completo:



La interfaz gráfica y el resto del procedimiento está contenido en un script de PowerShell de 31 kilobytes, ideal para incluirlo como herramienta adicional en entornos de pruebas y recuperación, sin dependencias adicionales ...más allá de PowerShell y .NET Framework.



Así se verá un archivo dummy en un editor hexadecimal:



Y así se verá el archivo dummy rellenado con datos aleatorios:





CreateDummyFile.ps1
Código
  1. <#PSScriptInfo
  2. .VERSION 1.0
  3. .GUID 26C67DF9-0F1E-4806-9D23-586DFBDECF88
  4. .AUTHOR ElektroStudios
  5. .COMPANYNAME ElektroStudios
  6. .COPYRIGHT ElektroStudios © 2025
  7. #>
  8.  
  9. $vbCode = @'
  10. #Region " Option Statements "
  11.  
  12. Option Strict On
  13. Option Explicit On
  14. Option Infer Off
  15.  
  16. #End Region
  17.  
  18. #Region " Imports "
  19.  
  20. Imports Microsoft.VisualBasic
  21.  
  22. Imports System
  23. Imports System.Collections.Generic
  24. Imports System.ComponentModel
  25. Imports System.Diagnostics
  26. Imports System.Diagnostics.CodeAnalysis
  27. Imports System.Drawing
  28. Imports System.Drawing.Design
  29. Imports System.Globalization
  30. Imports System.IO
  31. Imports System.Linq
  32. Imports System.Reflection
  33. Imports System.Runtime.CompilerServices
  34. Imports System.Runtime.InteropServices
  35. Imports System.Security
  36. Imports System.Text
  37. Imports System.Windows.Forms
  38. Imports System.Xml
  39. Imports System.Xml.Serialization
  40.  
  41. Imports DevCase.Core.IO.DigitalInformation
  42. Imports DevCase.Core.IO.FileSystem
  43. Imports DevCase.Runtime.TypeConverters
  44. Imports DevCase.Win32
  45. Imports DevCase.Win32.Enums
  46.  
  47. #End Region
  48.  
  49. #Region " CreateDummyFileOptionsForm "
  50.  
  51. Public NotInheritable Class CreateDummyFileOptionsForm : Inherits System.Windows.Forms.Form
  52.  
  53.    Public Sub New()
  54.        Me.InitializeComponent()
  55.    End Sub
  56.  
  57.    'Form overrides dispose to clean up the component list.
  58.    <System.Diagnostics.DebuggerNonUserCode()>
  59.    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
  60.        Try
  61.            If disposing AndAlso components IsNot Nothing Then
  62.                components.Dispose()
  63.            End If
  64.        Finally
  65.            MyBase.Dispose(disposing)
  66.        End Try
  67.    End Sub
  68.  
  69.    'Required by the Windows Form Designer
  70.    Private components As System.ComponentModel.IContainer
  71.    Friend WithEvents PropertyGrid1 As New PropertyGrid
  72.    Friend WithEvents ButtonCancel As Button
  73.    Friend WithEvents ButtonOk As Button
  74.    Friend WithEvents TableLayoutPanel1 As TableLayoutPanel
  75.    Friend WithEvents Panel1 As Panel
  76.  
  77.    'NOTE: The following procedure is required by the Windows Form Designer
  78.    'It can be modified using the Windows Form Designer.  
  79.    'Do not modify it using the code editor.
  80.    <System.Diagnostics.DebuggerStepThrough()>
  81.    Private Sub InitializeComponent()
  82.        Me.PropertyGrid1 = New System.Windows.Forms.PropertyGrid()
  83.        Me.ButtonCancel = New System.Windows.Forms.Button()
  84.        Me.ButtonOk = New System.Windows.Forms.Button()
  85.        Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel()
  86.        Me.Panel1 = New System.Windows.Forms.Panel()
  87.        Me.TableLayoutPanel1.SuspendLayout()
  88.        Me.Panel1.SuspendLayout()
  89.        Me.SuspendLayout()
  90.        '
  91.        'PropertyGrid1
  92.        '
  93.        Me.PropertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill
  94.        Me.PropertyGrid1.Location = New System.Drawing.Point(3, 4)
  95.        Me.PropertyGrid1.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4)
  96.        Me.PropertyGrid1.Name = "PropertyGrid1"
  97.        Me.PropertyGrid1.PropertySort = System.Windows.Forms.PropertySort.NoSort
  98.        Me.PropertyGrid1.Size = New System.Drawing.Size(733, 157)
  99.        Me.PropertyGrid1.TabIndex = 0
  100.        Me.PropertyGrid1.ToolbarVisible = False
  101.        '
  102.        'ButtonCancel
  103.        '
  104.        Me.ButtonCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
  105.        Me.ButtonCancel.Location = New System.Drawing.Point(624, 6)
  106.        Me.ButtonCancel.Name = "ButtonCancel"
  107.        Me.ButtonCancel.Size = New System.Drawing.Size(100, 40)
  108.        Me.ButtonCancel.TabIndex = 1
  109.        Me.ButtonCancel.Text = "Cancel"
  110.        Me.ButtonCancel.UseVisualStyleBackColor = True
  111.        '
  112.        'ButtonOk
  113.        '
  114.        Me.ButtonOk.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
  115.        Me.ButtonOk.Location = New System.Drawing.Point(518, 6)
  116.        Me.ButtonOk.Name = "ButtonOk"
  117.        Me.ButtonOk.Size = New System.Drawing.Size(100, 40)
  118.        Me.ButtonOk.TabIndex = 2
  119.        Me.ButtonOk.Text = "Ok"
  120.        Me.ButtonOk.UseVisualStyleBackColor = True
  121.        '
  122.        'TableLayoutPanel1
  123.        '
  124.        Me.TableLayoutPanel1.ColumnCount = 1
  125.        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
  126.        Me.TableLayoutPanel1.Controls.Add(Me.Panel1, 0, 1)
  127.        Me.TableLayoutPanel1.Controls.Add(Me.PropertyGrid1, 0, 0)
  128.        Me.TableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill
  129.        Me.TableLayoutPanel1.Location = New System.Drawing.Point(0, 0)
  130.        Me.TableLayoutPanel1.Name = "TableLayoutPanel1"
  131.        Me.TableLayoutPanel1.RowCount = 2
  132.        Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 73.17073!))
  133.        Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 26.82927!))
  134.        Me.TableLayoutPanel1.Size = New System.Drawing.Size(739, 226)
  135.        Me.TableLayoutPanel1.TabIndex = 3
  136.        '
  137.        'Panel1
  138.        '
  139.        Me.Panel1.Controls.Add(Me.ButtonOk)
  140.        Me.Panel1.Controls.Add(Me.ButtonCancel)
  141.        Me.Panel1.Dock = System.Windows.Forms.DockStyle.Fill
  142.        Me.Panel1.Location = New System.Drawing.Point(3, 168)
  143.        Me.Panel1.Name = "Panel1"
  144.        Me.Panel1.Size = New System.Drawing.Size(733, 55)
  145.        Me.Panel1.TabIndex = 4
  146.        '
  147.        'CreateDummyFileOptionsForm
  148.        '
  149.        Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 17.0!)
  150.        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
  151.        Me.ClientSize = New System.Drawing.Size(739, 226)
  152.        Me.Controls.Add(Me.TableLayoutPanel1)
  153.        Me.Font = New System.Drawing.Font("Segoe UI", 10.0!)
  154.        Me.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4)
  155.        Me.MaximizeBox = False
  156.        Me.Name = "CreateDummyFileOptionsForm"
  157.        Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
  158.        Me.Text = "Create Dummy File Options"
  159.        Me.TableLayoutPanel1.ResumeLayout(False)
  160.        Me.Panel1.ResumeLayout(False)
  161.        Me.ResumeLayout(False)
  162.  
  163.    End Sub
  164.  
  165.    Public Property DummyFileOptions As New DummyFileOptions
  166.  
  167.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  168.  
  169.        Me.PropertyGrid1.SelectedObject = Me.DummyFileOptions
  170.        DevCase.Extensions.PropertyGridExtensions.SetSplitterPosition(Me.PropertyGrid1, 145)
  171.        Me.MinimumSize = Me.Size
  172.        Me.MaximumSize = New Size(3840, Me.Height)
  173.    End Sub
  174.  
  175.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles ButtonCancel.Click
  176.        Me.DialogResult = DialogResult.Cancel
  177.        Me.Close()
  178.    End Sub
  179.  
  180.    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles ButtonOk.Click
  181.        Me.DialogResult = DialogResult.OK
  182.        Me.Close()
  183.    End Sub
  184.  
  185. End Class
  186.  
  187. #End Region
  188.  
  189. #Region " DummyFileOptions "
  190.  
  191. Public NotInheritable Class DummyFileOptions
  192.  
  193.    <Browsable(True)>
  194.    <Editor(GetType(SaveFileNameEditor), GetType(UITypeEditor))>
  195.    <DisplayName("File Path")>
  196.    <Description("File path where to create the dummy file.")>
  197.    Public Property FilePath As String = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "File.dummy")
  198.  
  199.    <TypeConverter(GetType(FileSizeConverter))>
  200.    <DisplayName("File Size")>
  201.    <Description("Size of the dummy file.")>
  202.    Public Property FileSize As New FileSize(1, DigitalStorageUnits.Megabyte)
  203.  
  204.    <Browsable(False)>
  205.    Public ReadOnly Property FileSizeBytes As ULong
  206.        Get
  207.            Return CULng(Me.FileSize.Size(DigitalStorageUnits.Byte))
  208.        End Get
  209.    End Property
  210.  
  211.    <TypeConverter(GetType(FileSizeConverter))>
  212.    <DisplayName("Buffer Size")>
  213.    <Description("Size of the buffer used to write the dummy file.")>
  214.    Public Property BufferSize As New FileSize(4, DigitalStorageUnits.Megabyte)
  215.  
  216.    <Browsable(False)>
  217.    Public ReadOnly Property BufferSizeBytes As Integer
  218.        Get
  219.            Return CInt(Me.BufferSize.Size(DigitalStorageUnits.Byte))
  220.        End Get
  221.    End Property
  222.  
  223.    <DisplayName("Use Random Data")>
  224.    <Description("If True, uses random bytes to fill the dummy file content; othewise, fills the dummy file with zero bytes.")>
  225.    Public Property UseRandomData As Boolean = False
  226.  
  227. End Class
  228.  
  229. #End Region
  230.  
  231. #Region " SaveFileNameEditor "
  232.  
  233. Public NotInheritable Class SaveFileNameEditor : Inherits UITypeEditor
  234.  
  235.    Public Overrides Function GetEditStyle(context As ITypeDescriptorContext) As UITypeEditorEditStyle
  236.        Return UITypeEditorEditStyle.Modal
  237.    End Function
  238.  
  239.    Public Overrides Function EditValue(context As ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
  240.        If context Is Nothing OrElse context.Instance Is Nothing OrElse provider Is Nothing Then
  241.            Return MyBase.EditValue(context, provider, value)
  242.        End If
  243.  
  244.        Using saveFileDialog As New SaveFileDialog()
  245.            If value IsNot Nothing Then
  246.                saveFileDialog.FileName = value.ToString()
  247.            End If
  248.  
  249.            saveFileDialog.Title = "Select a location to save the dummy file"
  250.            saveFileDialog.Filter = "All files (*.*)|*.*"
  251.            saveFileDialog.FileName = "File.dummy"
  252.            If saveFileDialog.ShowDialog() = DialogResult.OK Then
  253.                value = saveFileDialog.FileName
  254.            End If
  255.        End Using
  256.  
  257.        Return value
  258.    End Function
  259. End Class
  260.  
  261. #End Region
  262.  
  263. #Region " NativeMethods "
  264.  
  265. Namespace DevCase.Win32.NativeMethods
  266.  
  267.    <HideModuleName>
  268.    <SuppressUnmanagedCodeSecurity>
  269.    <SuppressMessage("CodeQuality", "IDE0079:Remove unnecessary suppression", Justification:="Required to migrate this code to .NET Core")>
  270.    <SuppressMessage("Interoperability", "CA1401:P/Invokes should not be visible", Justification:="")>
  271.    Public Module ShlwApi
  272.  
  273. #Region " ShlwApi.dll "
  274.  
  275.        <DllImport("ShlwApi.dll", SetLastError:=True, ExactSpelling:=True, CharSet:=CharSet.Ansi, BestFitMapping:=False, ThrowOnUnmappableChar:=True)>
  276.        Public Function StrFormatByteSize64A(number As ULong,
  277.                                            buffer As StringBuilder,
  278.                                            bufferSize As UInteger
  279.        ) As IntPtr
  280.        End Function
  281.  
  282.        <DllImport("ShlwApi.dll", SetLastError:=False, ExactSpelling:=True, CharSet:=CharSet.Unicode)>
  283.        Public Function StrFormatByteSizeEx(number As ULong,
  284.                                            flags As StrFormatByteSizeFlags,
  285.                                            buffer As StringBuilder,
  286.                                            bufferSize As UInteger
  287.        ) As Integer ' HResult
  288.        End Function
  289.  
  290. #End Region
  291.  
  292.    End Module
  293.  
  294. End Namespace
  295.  
  296. #End Region
  297.  
  298. #Region " StrFormatByteSizeFlags "
  299.  
  300. Namespace DevCase.Win32.Enums
  301.  
  302.    Public Enum StrFormatByteSizeFlags
  303.        RoundToNearest = 1
  304.        Truncate = 2
  305.    End Enum
  306.  
  307. End Namespace
  308.  
  309. #End Region
  310.  
  311. #Region " Size Units "
  312.  
  313. Namespace DevCase.Core.IO.DigitalInformation
  314.  
  315.    Public Enum DigitalStorageUnits As Long
  316.        [Byte] = CLng(2 ^ 0)
  317.        Kilobyte = CLng(2 ^ 10)
  318.        Megabyte = CLng(2 ^ 20)
  319.        Gigabyte = CLng(2 ^ 30)
  320.        Terabyte = CLng(2 ^ 40)
  321.        Petabyte = CLng(2 ^ 50)
  322.        Exabyte = CLng(2 ^ 60)
  323.    End Enum
  324.  
  325. End Namespace
  326.  
  327. #End Region
  328.  
  329. #Region " Filesize "
  330.  
  331. Namespace DevCase.Core.IO.FileSystem
  332.  
  333.    Public NotInheritable Class FileSize
  334.  
  335. #Region " Private Fields "
  336.  
  337.        Private ReadOnly bytesB As Double
  338.  
  339. #End Region
  340.  
  341. #Region " Properties "
  342.  
  343.        Public ReadOnly Property Size(sizeUnit As DigitalStorageUnits) As Double
  344.            Get
  345.                Return Convert(size:=Me.bytesB, fromUnit:=DigitalStorageUnits.Byte, toUnit:=sizeUnit)
  346.            End Get
  347.        End Property
  348.  
  349.        Public ReadOnly Property Size(sizeUnit As DigitalStorageUnits, decimalPrecision As Integer, Optional numberFormatInfo As NumberFormatInfo = Nothing) As String
  350.            Get
  351.                If numberFormatInfo Is Nothing Then
  352.                    numberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
  353.                End If
  354.                Return Me.Size(sizeUnit).ToString(String.Format("N{0}", decimalPrecision), numberFormatInfo)
  355.            End Get
  356.        End Property
  357.  
  358.        Public Property SizeRounded As Double
  359.  
  360.        Public ReadOnly Property SizeRounded(decimalPrecision As Integer, Optional numberFormatInfo As NumberFormatInfo = Nothing) As String
  361.            Get
  362.                If numberFormatInfo Is Nothing Then
  363.                    numberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
  364.                End If
  365.                Return Me.SizeRounded.ToString(String.Format("N{0}", decimalPrecision), numberFormatInfo)
  366.            End Get
  367.        End Property
  368.  
  369.        Public Property SizeUnit As DigitalStorageUnits
  370.        Public Property SizeUnitNameShort As String
  371.        Public Property SizeUnitNameLong As String
  372.  
  373. #End Region
  374.  
  375. #Region " Constructors "
  376.  
  377.        Private Sub New()
  378.        End Sub
  379.  
  380.        <DebuggerStepThrough>
  381.        Public Sub New(size As Double, sizeUnit As DigitalStorageUnits)
  382.  
  383.            Me.bytesB = System.Convert.ToDouble(size * sizeUnit)
  384.  
  385.            Select Case System.Math.Abs(Me.bytesB)
  386.  
  387.                Case Is >= DigitalStorageUnits.Petabyte
  388.                    Me.SizeRounded = Me.bytesB / DigitalStorageUnits.Petabyte
  389.                    Me.SizeUnit = DigitalStorageUnits.Petabyte
  390.                    Me.SizeUnitNameShort = "PB"
  391.                    Me.SizeUnitNameLong = "PetaBytes"
  392.  
  393.                Case Is >= DigitalStorageUnits.Terabyte
  394.                    Me.SizeRounded = Me.bytesB / DigitalStorageUnits.Terabyte
  395.                    Me.SizeUnit = DigitalStorageUnits.Terabyte
  396.                    Me.SizeUnitNameShort = "TB"
  397.                    Me.SizeUnitNameLong = "TeraBytes"
  398.  
  399.                Case Is >= DigitalStorageUnits.Gigabyte
  400.                    Me.SizeRounded = Me.bytesB / DigitalStorageUnits.Gigabyte
  401.                    Me.SizeUnit = DigitalStorageUnits.Gigabyte
  402.                    Me.SizeUnitNameShort = "GB"
  403.                    Me.SizeUnitNameLong = "GigaBytes"
  404.  
  405.                Case Is >= DigitalStorageUnits.Megabyte
  406.                    Me.SizeRounded = Me.bytesB / DigitalStorageUnits.Megabyte
  407.                    Me.SizeUnit = DigitalStorageUnits.Megabyte
  408.                    Me.SizeUnitNameShort = "MB"
  409.                    Me.SizeUnitNameLong = "MegaBytes"
  410.  
  411.                Case Is >= DigitalStorageUnits.Kilobyte
  412.                    Me.SizeRounded = Me.bytesB / DigitalStorageUnits.Kilobyte
  413.                    Me.SizeUnit = DigitalStorageUnits.Kilobyte
  414.                    Me.SizeUnitNameShort = "KB"
  415.                    Me.SizeUnitNameLong = "KiloBytes"
  416.  
  417.                Case Is >= DigitalStorageUnits.Byte, Is = 0
  418.                    Me.SizeRounded = Me.bytesB / DigitalStorageUnits.Byte
  419.                    Me.SizeUnit = DigitalStorageUnits.Byte
  420.                    Me.SizeUnitNameShort = "Bytes"
  421.                    Me.SizeUnitNameLong = "Bytes"
  422.            End Select
  423.  
  424.        End Sub
  425.  
  426. #End Region
  427.  
  428. #Region " Public Methods "
  429.  
  430.        Public Overrides Function ToString() As String
  431.            Return Me.ToString(CultureInfo.InvariantCulture.NumberFormat)
  432.        End Function
  433.  
  434.        Public Overloads Function ToString(provider As IFormatProvider) As String
  435.            Return If(Me.SizeUnit = DigitalStorageUnits.Byte,
  436.                String.Format(provider, "{0:0.##} {1}", System.Math.Floor(Me.SizeRounded * 100) / 100, Me.SizeUnitNameShort),
  437.                String.Format(provider, "{0:0.00} {1}", System.Math.Floor(Me.SizeRounded * 100) / 100, Me.SizeUnitNameShort))
  438.        End Function
  439.  
  440.        Public Function ToStringFormatByteSize(flags As StrFormatByteSizeFlags) As String
  441.  
  442.            Dim buffer As New StringBuilder(8, 16)
  443.            Dim result As Integer = NativeMethods.StrFormatByteSizeEx(CULng(Me.bytesB), flags, buffer, 16) ' HRESULT
  444.            If result <> 0 Then
  445.                Marshal.ThrowExceptionForHR(result)
  446.            End If
  447.  
  448.            Return buffer.ToString()
  449.        End Function
  450.  
  451. #End Region
  452.  
  453. #Region " Private Methods "
  454.  
  455.        <DebuggerStepThrough>
  456.        Private Shared Function Convert(size As Double,
  457.                                 fromUnit As DigitalStorageUnits,
  458.                                 toUnit As DigitalStorageUnits) As Double
  459.  
  460.            Dim bytes As Double = If(fromUnit = DigitalStorageUnits.Byte, size, System.Convert.ToDouble(size * fromUnit))
  461.  
  462.            If toUnit < fromUnit Then
  463.                Select Case toUnit
  464.                    Case DigitalStorageUnits.Byte
  465.                        Return bytes
  466.  
  467.                    Case DigitalStorageUnits.Kilobyte
  468.                        Return bytes / DigitalStorageUnits.Kilobyte
  469.  
  470.                    Case DigitalStorageUnits.Megabyte
  471.                        Return bytes / DigitalStorageUnits.Megabyte
  472.  
  473.                    Case DigitalStorageUnits.Gigabyte
  474.                        Return bytes / DigitalStorageUnits.Gigabyte
  475.  
  476.                    Case DigitalStorageUnits.Terabyte
  477.                        Return bytes / DigitalStorageUnits.Terabyte
  478.  
  479.                    Case DigitalStorageUnits.Petabyte
  480.                        Return bytes / DigitalStorageUnits.Petabyte
  481.  
  482.                    Case Else
  483.                        Throw New InvalidEnumArgumentException(argumentName:="toUnit", invalidValue:=CInt(toUnit),
  484.                                                               enumClass:=GetType(DigitalStorageUnits))
  485.                End Select
  486.  
  487.            ElseIf toUnit > fromUnit Then
  488.                Select Case toUnit
  489.  
  490.                    Case DigitalStorageUnits.Byte
  491.                        Return bytes
  492.  
  493.                    Case DigitalStorageUnits.Kilobyte
  494.                        Return bytes * DigitalStorageUnits.Kilobyte / (DigitalStorageUnits.Kilobyte ^ 2)
  495.  
  496.                    Case DigitalStorageUnits.Megabyte
  497.                        Return bytes * DigitalStorageUnits.Megabyte / (DigitalStorageUnits.Megabyte ^ 2)
  498.  
  499.                    Case DigitalStorageUnits.Gigabyte
  500.                        Return bytes * DigitalStorageUnits.Gigabyte / (DigitalStorageUnits.Gigabyte ^ 2)
  501.  
  502.                    Case DigitalStorageUnits.Terabyte
  503.                        Return bytes * DigitalStorageUnits.Terabyte / (DigitalStorageUnits.Terabyte ^ 2)
  504.  
  505.                    Case DigitalStorageUnits.Petabyte
  506.                        Return bytes * DigitalStorageUnits.Petabyte / (DigitalStorageUnits.Petabyte ^ 2)
  507.  
  508.                    Case Else
  509.                        Throw New InvalidEnumArgumentException(argumentName:="toUnit", invalidValue:=CInt(toUnit),
  510.                                                               enumClass:=GetType(DigitalStorageUnits))
  511.                End Select
  512.  
  513.            Else ' If toUnit = fromUnit
  514.                Return bytes
  515.  
  516.            End If
  517.        End Function
  518.  
  519. #End Region
  520.  
  521.    End Class
  522.  
  523. End Namespace
  524.  
  525. #End Region
  526.  
  527. #Region " FileSizeConverter "
  528.  
  529. Namespace DevCase.Runtime.TypeConverters
  530.  
  531.    Public Class FileSizeConverter : Inherits TypeConverter
  532.  
  533. #Region " Private Fields "
  534.  
  535.        Private ReadOnly sizeUnitsDictionary As Dictionary(Of String(), ULong)
  536.  
  537. #End Region
  538.  
  539. #Region " Constructors "
  540.  
  541.        Public Sub New()
  542.            Me.sizeUnitsDictionary = New Dictionary(Of String(), ULong)(StringComparison.OrdinalIgnoreCase) From {
  543.                {{"b", "byte", "bytes"}, 1UL},
  544.                {{"KB", "kilo", "kilos", "kilobyte", "kilobytes", "kilo byte", "kilo bytes"}, 1024UL},
  545.                {{"MB", "mega", "megas", "megabyte", "megabytes", "mega byte", "mega bytes"}, CULng(1024UL ^ 2UL)},
  546.                {{"GB", "giga", "gigas", "gigabyte", "gigabytes", "giga byte", "giga bytes"}, CULng(1024UL ^ 3UL)},
  547.                {{"TB", "tera", "teras", "terabyte", "terabytes", "tera byte", "tera bytes"}, CULng(1024UL ^ 4UL)},
  548.                {{"PB", "peta", "petas", "petabyte", "petabytes", "peta byte", "peta bytes"}, CULng(1024UL ^ 5UL)},
  549.                {{"EB", "exa", "exas", "exabyte", "exabytes", "exa byte", "exa bytes"}, CULng(1024UL ^ 6UL)}
  550.            }
  551.        End Sub
  552.  
  553. #End Region
  554.  
  555. #Region " Public Methods "
  556.  
  557.        Public Overrides Function CanConvertFrom(context As ITypeDescriptorContext, sourceType As Type) As Boolean
  558.  
  559.            Return sourceType Is GetType(String) OrElse
  560.                   MyBase.CanConvertFrom(context, sourceType)
  561.        End Function
  562.  
  563.        Public Overrides Function CanConvertTo(context As ITypeDescriptorContext, destinationType As Type) As Boolean
  564.  
  565.            Return destinationType Is GetType(ULong) OrElse
  566.                   destinationType Is GetType(String) OrElse
  567.                   MyBase.CanConvertTo(context, destinationType)
  568.        End Function
  569.  
  570.        <DebuggerStepThrough>
  571.        Public Overrides Function ConvertFrom(context As ITypeDescriptorContext, culture As CultureInfo, value As Object) As Object
  572.  
  573.            If TypeOf value Is String Then
  574.                Dim strValue As String = DirectCast(value, String)
  575.                If strValue.Contains("("c) Then
  576.                    strValue = strValue.Substring(0, strValue.IndexOf("("c))
  577.                End If
  578.                Dim bytes As ULong
  579.                If ULong.TryParse(strValue, bytes) Then
  580.                    Return bytes
  581.                End If
  582.                bytes = Me.ParseFileSizeString(strValue)
  583.                If bytes <> 0UL Then
  584.                    If context.PropertyDescriptor IsNot Nothing AndAlso context.PropertyDescriptor.PropertyType Is GetType(FileSize) Then
  585.                        Return New FileSize(bytes, DigitalStorageUnits.Byte)
  586.                    Else
  587.                        Return DirectCast(bytes, Object)
  588.                    End If
  589.                End If
  590.            End If
  591.  
  592.            Return MyBase.ConvertFrom(context, culture, value)
  593.        End Function
  594.  
  595.        <DebuggerStepThrough>
  596.        Public Overrides Function ConvertTo(context As ITypeDescriptorContext, culture As CultureInfo, value As Object, destinationType As Type) As Object
  597.            If destinationType Is GetType(String) Then
  598.                Dim bytes As ULong = If((TypeOf value Is FileSize), CULng(DirectCast(value, FileSize).Size(DigitalStorageUnits.Byte)), DirectCast(value, ULong))
  599.                Dim formattedSize As String = Me.FormatByteFileSize(bytes)
  600.                Return If(bytes < 1024, String.Format("{0}", formattedSize), String.Format("{0} ({1:N0} bytes)", formattedSize, bytes))
  601.            End If
  602.  
  603.            Return MyBase.ConvertTo(context, culture, value, destinationType)
  604.        End Function
  605.  
  606. #End Region
  607.  
  608. #Region " Private Methods "
  609.  
  610.        <DebuggerStepThrough>
  611.        Private Function ParseFileSizeString(sizeString As String) As ULong
  612.  
  613.            Dim trimmedSizeString As String = sizeString.Trim()
  614.            If trimmedSizeString.Contains("("c) Then
  615.                trimmedSizeString = trimmedSizeString.Substring(0, trimmedSizeString.IndexOf("("c))
  616.            End If
  617.  
  618.            For Each kvp As KeyValuePair(Of String(), ULong) In sizeUnitsDictionary
  619.                For Each sizeUnitName As String In kvp.Key
  620.                    If trimmedSizeString.EndsWith(sizeUnitName, StringComparison.OrdinalIgnoreCase) Then
  621.                        Dim numString As String = trimmedSizeString.Substring(0, trimmedSizeString.Length - sizeUnitName.Length).Trim()
  622.                        Dim num As Double
  623.                        Dim numberFormat As IFormatProvider
  624. #If NETCOREAPP Then
  625.                        numberFormat = Thread.CurrentThread.CurrentUICulture.NumberFormat
  626. #Else
  627.                        numberFormat = My.Application.UICulture.NumberFormat
  628. #End If
  629.                        If Double.TryParse(numString, NumberStyles.Number, numberFormat, num) Then
  630.                            Try
  631.                                Return CULng((num * kvp.Value))
  632.                            Catch ex As OverflowException
  633.                                Return ULong.MaxValue
  634.                            Catch ex As Exception
  635.                                Throw
  636.                            End Try
  637.                        End If
  638.                    End If
  639.                Next sizeUnitName
  640.            Next kvp
  641.  
  642.            Throw New Exception("Cannot parse the specified file size value.")
  643.        End Function
  644.  
  645.  
  646.        <DebuggerStepThrough>
  647.        Private Function FormatByteFileSize(bytes As ULong) As String
  648.            Dim unitIndex As Integer = 0
  649.            Dim fileSize As Double = bytes
  650.  
  651.            While (fileSize >= 1024) AndAlso (unitIndex < sizeUnitsDictionary.Count - 1)
  652.                fileSize /= 1024
  653.                unitIndex += 1
  654.            End While
  655.  
  656.            Return If(unitIndex = 0,
  657.                       String.Format("{0} bytes", fileSize),
  658.                       String.Format("{0:F2} {1}", fileSize, sizeUnitsDictionary.ElementAt(unitIndex).Key(0)).Replace(",00", ""))
  659.        End Function
  660.  
  661. #End Region
  662.  
  663.    End Class
  664.  
  665. End Namespace
  666.  
  667. #End Region
  668.  
  669. #Region " PropertyGridExtensions "
  670.  
  671. Namespace DevCase.Extensions.PropertyGridExtensions
  672.  
  673.    <HideModuleName>
  674.    Public Module PropertyGridExtensions
  675.  
  676. #Region " Public Extension Methods "
  677.  
  678.        <DebuggerStepThrough>
  679.        <Extension>
  680.        <EditorBrowsable(EditorBrowsableState.Always)>
  681.        Public Function IsInitialized(propGrid As PropertyGrid) As Boolean
  682.  
  683.            Return PropertyGridExtensions.GetInternalLabelWidth(propGrid) <> -1
  684.        End Function
  685.  
  686.        <DebuggerStepThrough>
  687.        <Extension>
  688.        <EditorBrowsable(EditorBrowsableState.Always)>
  689.        Public Sub SetSplitterPosition(propGrid As PropertyGrid, xPos As Integer)
  690.  
  691.            If Not PropertyGridExtensions.IsInitialized(propGrid) Then
  692.                Throw New InvalidOperationException("The PropertyGrid must be initialized in order to set the splitter control position.")
  693.            End If
  694.  
  695.            Dim internalGridView As Control = PropertyGridExtensions.GetPropertyGridInternal(propGrid)
  696.            Dim moveSplitterToMethod As MethodInfo = internalGridView.GetType().GetMethod("MoveSplitterTo", BindingFlags.NonPublic Or BindingFlags.Instance)
  697.            moveSplitterToMethod.Invoke(internalGridView, {xPos})
  698.        End Sub
  699.  
  700. #End Region
  701.  
  702. #Region " Private Methods "
  703.  
  704.        Private Function GetPropertyGridInternal(propGrid As PropertyGrid) As Control
  705.  
  706.            ' Class: System.Windows.Forms.PropertyGridInternal.PropertyGridView
  707.  
  708.            Dim getPropertyGridViewMethod As MethodInfo = GetType(PropertyGrid).GetMethod("GetPropertyGridView", BindingFlags.NonPublic Or BindingFlags.Instance)
  709.            Dim gridView As Control = DirectCast(getPropertyGridViewMethod.Invoke(propGrid, Array.Empty(Of Object)()), Control)
  710.            Return gridView
  711.  
  712.            ' We can also retrieve the internal PropertyGridView this other way:
  713.            ' ------------------------------------------------------------------
  714.            ' Dim gridViewFieldInfo As FieldInfo = propGrid.GetType().GetField("gridView", BindingFlags.Instance Or BindingFlags.NonPublic)
  715.            ' Dim gridView As Control = DirectCast(gridViewFieldInfo.GetValue(propGrid), Control)
  716.            ' Return gridView
  717.        End Function
  718.  
  719.        Private Function GetInternalLabelWidth(propGrid As PropertyGrid) As Integer
  720.  
  721.            Dim internalGridView As Control = PropertyGridExtensions.GetPropertyGridInternal(propGrid)
  722.            Dim propInfo As PropertyInfo = internalGridView.GetType().GetProperty("InternalLabelWidth", BindingFlags.NonPublic Or BindingFlags.Instance)
  723.            Return CInt(propInfo.GetValue(internalGridView))
  724.        End Function
  725.  
  726. #End Region
  727.  
  728.    End Module
  729.  
  730. End Namespace
  731.  
  732. #End Region
  733. '@
  734. $assembly = Add-Type -TypeDefinition $vbCode `
  735.                      -CodeDomProvider (New-Object Microsoft.VisualBasic.VBCodeProvider) `
  736.                      -PassThru `
  737.                      -ReferencedAssemblies "Microsoft.VisualBasic.dll", `
  738.                                            "System.Windows.Forms.dll", `
  739.                                            "System.Security.dll", `
  740.                                            "System.Collections.dll", `
  741.                                            "System.Drawing.dll", `
  742.                                            "System.Globalization.dll", `
  743.                                            "System.Reflection.dll", `
  744.                                            "System.Linq.dll", `
  745.                                            "System.IO.dll", `
  746.                                            "System.Xml.dll", `
  747.                                            "System.Xml.Serialization.dll", `
  748.                                            "System.dll" `
  749.                      | where { $_.IsPublic }
  750.  
  751.  
  752. function Get-FormattedSize {
  753.    param (
  754.        [int64]$sizeInBytes
  755.    )
  756.  
  757.    $buffer = New-Object System.Text.StringBuilder 24
  758.    $resultPtr = [DevCase.Win32.NativeMethods.ShlwApi]::StrFormatByteSize64A($sizeInBytes, $buffer, $buffer.Capacity)
  759.  
  760.    if ($resultPtr -eq [IntPtr]::Zero) {
  761.        return "Error formatting the file size."
  762.    } else {
  763.        return $buffer.ToString()
  764.    }
  765. }
  766.  
  767. function WriteDummyFile {
  768.    param (
  769.        [string]$FilePath,
  770.        [uint64]$FileSize,
  771.        [uint64]$BufferSize = 4MB,
  772.        [bool]$randomData = $false
  773.    )
  774.  
  775.    $formattedFileSize = Get-FormattedSize -sizeInBytes $FileSize
  776.  
  777.    $fs = [System.IO.File]::Create($FilePath)
  778.  
  779.    if ($BufferSize -ge $FileSize) {
  780.        $BufferSize = [math]::Floor($FileSize / 2)
  781.    }
  782.  
  783.    [int64]$bytesWritten = 0
  784.    $buffer = New-Object byte[] $BufferSize
  785.    $rand = New-Object Random
  786.  
  787.    Write-Host "Creating dummy file at '$FilePath' with a size of $formattedFileSize..."
  788.  
  789.    while ($bytesWritten -lt $FileSize) {
  790.        $bytesToWrite = [math]::Min($BufferSize, $FileSize - $bytesWritten)
  791.  
  792.        if ($randomData) {
  793.            $rand.NextBytes($buffer)
  794.        } else {
  795.            [Array]::Clear($buffer, 0, $bytesToWrite)
  796.        }
  797.  
  798.        $fs.Write($buffer, 0, $bytesToWrite)
  799.  
  800.        $bytesWritten += $bytesToWrite
  801.        $formattedBytesWritten = Get-FormattedSize -sizeInBytes $bytesWritten
  802.  
  803.        $progressPercent = [math]::Min(($bytesWritten / $FileSize) * 100, 100)
  804.  
  805.        Write-Progress -PercentComplete $progressPercent -Status "$FilePath" -Activity "Writing dummy file..." -CurrentOperation "$formattedBytesWritten written."
  806.    }
  807.        Write-Progress -PercentComplete 100 -Status "$FilePath" -Activity "Dummy file has been written." -CurrentOperation "$formattedBytesWritten written."
  808.  
  809.    $fs.Close()
  810.  
  811.    Write-Host ""
  812.    Write-Host ""
  813.    Write-Host ""
  814.    Write-Host ""
  815.    Write-Host ""
  816.    Write-Host ""
  817.    Write-Host ""
  818.    Write-Host ""
  819.    Write-Host ""
  820.    Write-Host "Dummy file successfully created at '$FilePath' with a size of $formattedFileSize."
  821. }
  822.  
  823.  
  824. $form = New-Object CreateDummyFileOptionsForm
  825. $dlgResult = $form.ShowDialog()
  826.  
  827. if ($dlgResult -eq [System.Windows.Forms.DialogResult]::OK) {
  828.    $fileOptions = $form.DummyFileOptions
  829.    WriteDummyFile -FilePath $fileOptions.FilePath -FileSize $fileOptions.FileSizeBytes -BufferSize $fileOptions.BufferSizeBytes -randomData $fileOptions.UseRandomData
  830. } else {
  831.    Write-Host "Operation canceled. No file selected."
  832. }
  833.  
  834. Write-Host "Press any key to exit..."
  835. $key = [System.Console]::ReadKey($true)
  836. Exit(0)
  837.  
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 1254
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines